SQL Management Studio를 사용할 때 실행되는 SQL 쿼리가 1 초 미만이지만 코드 실행시 30 개가 넘습니다. 초를 사용하여 데이터베이스 서버에서 결과를 가져옵니다. 결과에는 1700 개의 행이 포함됩니다. 900 개의 행을 반환하는 또 다른 비슷한 쿼리는 실행에 몇 밀리 초가 걸립니다. 이 이상한 행동의 이유는 무엇일까요?코드에서 SQL 쿼리가 db db 쿼리보다 훨씬 오래 걸림
public SqlDataReader ExecuteReader(string strSQL, ArrayList arParams)
{
OpenConnection();
SqlCommand myCommand = new SqlCommand(strSQL, myConnection);
myCommand.CommandTimeout = intTimeout;
foreach (SqlParameter myParameter in arParams)
myCommand.Parameters.Add(myParameter);
return myCommand.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
}
STRSQL :
SELECT [Group].[Id]
,[Group].[intCustomerId]
,[Group].[strName]
,[Permission].[dtmCreated]
,[Permission].[intPermissionTypeId]
,[Permission].[intObjectTypeId]
,[Permission].[intObjectId]
,[Permission].[blnActive]
,[Permission].[blnHaveAccess]
,[Permission].[intLevelTypeId]
FROM [Group]
LEFT JOIN Permission ON [Group].[Id] = intGroupId AND
intObjectId = @ObjectId AND
intObjectTypeId = @ObjectTypeId AND
intLevelTypeId = @LevelType AND
intPermissionTypeId = @PermissionTypeId AND
blnActive = 1
WHERE [Group].[intCustomerId] = @CustomerId AND
[Group].[blnDeleted] = 0
ORDER BY strName, blnActive DESC
arParams :
이arParams.Add(DatabaseHandler.MakeSqlParameter("@CustomerId", customer.Id));
arParams.Add(DatabaseHandler.MakeSqlParameter("@ObjectId", masterprocess.Id));
arParams.Add(DatabaseHandler.MakeSqlParameter("@ObjectTypeId", Convert.ToInt32(ObjectType.MasterProcess)));
arParams.Add(DatabaseHandler.MakeSqlParameter("@PermissionTypeId", Convert.ToInt32(permissiontype)));
arParams.Add(DatabaseHandler.MakeSqlParameter("@LevelType", Convert.ToInt32(leveltype)));
DatabaseHandler.MakeSqlParameter : 의견에 대한 회신을 바탕으로
public static SqlParameter MakeSqlParameter(String strName, int intInput)
{
return new SqlParameter(strName, intInput);
}
http://stackoverflow.com/questions/1642453/sql-query-and-datetime-parameter-takes-long-time-to-execute 및 @gbn의 대답을 살펴보십시오. 아마도, SQL이 예상하는 것과 동기화되지 않은 SQLParameters의 데이터 유형이 될 수 있습니다. 예 : 하나 이상의 SQLParameter의 매개 변수 유형은 varchar 일 수 있지만 int이어야합니다 (SQL이 예상하는 것처럼). – shahkalpesh
"parameter sniffing"의 경우일지도 모르지만 적용하려면 :'strSQL'은 리터럴 쿼리입니까, 아니면 쿼리를 내부적으로 호출하는 저장 프로 시저의 이름입니까? 두 경우 모두 동일한 매개 변수 값으로 테스트합니까? –
아마도 그 상자에 충분한 양이 있다면 게시하겠습니까? SQL 관리 도구가 현재 Rescource 대기에 대해 말하는 것은 무엇입니까? – EKS