2011-09-15 2 views
4

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); 
} 
+1

http://stackoverflow.com/questions/1642453/sql-query-and-datetime-parameter-takes-long-time-to-execute 및 @gbn의 대답을 살펴보십시오. 아마도, SQL이 예상하는 것과 동기화되지 않은 SQLParameters의 데이터 유형이 될 수 있습니다. 예 : 하나 이상의 SQLParameter의 매개 변수 유형은 varchar 일 수 있지만 int이어야합니다 (SQL이 예상하는 것처럼). – shahkalpesh

+0

"parameter sniffing"의 경우일지도 모르지만 적용하려면 :'strSQL'은 리터럴 쿼리입니까, 아니면 쿼리를 내부적으로 호출하는 저장 프로 시저의 이름입니까? 두 경우 모두 동일한 매개 변수 값으로 테스트합니까? –

+0

아마도 그 상자에 충분한 양이 있다면 게시하겠습니까? SQL 관리 도구가 현재 Rescource 대기에 대해 말하는 것은 무엇입니까? – EKS

답변

1

내가 올바른 해결책이 인덱스입니다 말할 것 .

가장 간단한 방법은 일반적인 쿼리를 실행할 때 약간의 SQL 로깅을 실행 한 다음 나중에 SQL 프로파일 러를 실행하는 것입니다.

권장 사항에 따르면 누락 된 색인을 나타낼 수 있습니다.

+1

올바른 방향으로 나를 밀어 넣은 것처럼 보입니다. 나는 색인을 다시 만들 수 있다는 것을 알았고, 마녀를 나의 Permission 테이블에서 만들었다. 그리고 지금은 보통 속도로 달린다. 여전히 관리 스튜디오에서 쿼리를 실행하는 것이 코드에서 실행하는 것보다 훨씬 빠르다는 것을 이해하지 못합니다. –

0

나는이 문제를 보면서 같은 문제가 있었지만 해결책을 생각했다.

매개 변수가있는 SQLCommand를 사용하여 쿼리를 실행하면 쿼리가 실행되지 않습니다. 저장 프로 시저 보조 프로그램을 사용하여 매개 변수를 패키지화합니다. Exec과 같은 것 sp_Execute.

매개 변수를 바꾸면 개선 사항 (SQL 주입 위험이 있음)을 알아야합니다.

또한 추가로 이동하여 테이블 옆에 WITH (INDEX)를 지정하여 사용할 색인을 지정할 수 있습니다. (PK 인덱스를 시도하고 사용할 수 있기 때문에).