2013-03-06 4 views
2

SQL 프로필러에 표시된 것처럼 SqlCommand.ExecuteReader를 호출하는 데 SQL 호출 자체보다 완료하는 시간이 짧습니까?SqlCommand.ExecuteReader 지속 기간이 SQL 프로파일 러 일괄 처리 기간보다 짧습니다.

나는를 SqlCommand.ExecuteReader를 호출하는 콘솔 응용 프로그램에서 실행되는 다음과 같은 간단한 코드를 가지고있는 내가 시간을 스톱워치 객체 사용 : SQL 배치 기간은 4 회에보고 된 것보다 더 긴 평균적으로

var swQueryTime = new Stopwatch(); 

     var conn = new SqlConnection("Data Source=.;Initial Catalog=master;Trusted_Connection=True;"); 
     conn.Open(); 
     string sql = string.Format(@"select * from sys.dm_os_memory_clerks; select * from sys.dm_os_performance_counters "); 

     for (int i = 0; i < 10; i++) 
     {     
      var comm = new SqlCommand(sql, conn); 
      swQueryTime.Restart(); 

      var dr = comm.ExecuteReader(); 

      swQueryTime.Stop(); 

      Console.WriteLine("ElapsedMilliseconds: {0}", swQueryTime.ElapsedMilliseconds); 

      dr.Close(); 
      comm = null; 
     } 

을 .Net 측에서.

프로파일 러에서 밀리 초를 구체적으로보고했는지 확인했습니다.

SqlCommand.ExecuteReader의 비동기 버전을 사용하고 있지 않습니다.

프로파일 러 지속 시간은 프로파일 러 시작 및 종료 시간을 사용하여 읽고 검증 한 것의 여러 스레드/코어에 걸친 모든 시간의 합계가 아닙니다.

감사합니다.

+0

+1 : SQL 프로필러 밀리/마이크로 초 체크 용. – RBarryYoung

+0

프로필러에서 SQL 문 자체의 기간을 확인 했습니까? 일괄 처리 기간보다 항상 적습니다. 일반적으로 차이는 약간이지만 때로는 중요합니다. – RBarryYoung

+0

예 진술 기간을 확인했습니다 - 2 진술 문은 예상되는 배치 지속 시간의 합계입니다. – user2139987

답변

2

배치의 시작 시점 만 있기 때문에 일부 쿼리의 성능을 변경할 수있는 몇 가지 SET 옵션도 있습니다, 그런데

using(var dr = comm.ExecuteReader()) { 
    do { 
     while(dr.Read()) {} 
    } while (dr.NextResult()); 
} 

을 -이 여기에 적용해야 확실하지 않은,하지만 : 당신 너무 데이터를 소비하는 경우, 시간은 아마 줄 것이다 + 지속 값을 계산 한 테이블에 큰 영향을 미칠 수 있습니다. 열이 생성 될 때 SET 값이 설정과 호환되지 않으면 행당 계산을 다시 실행해야합니다. 이것은 특히입니다. 계산 된 + 지속 + 색인 된 열의 경우 해당 열을 필터링하는 경우 눈에 띄게됩니다. 색인 스캔/색인 탐색 대신 표 스캔 (또는 유사한)을 수행해야합니다.

+0

+1 : 이것은 아마도 그럴 것입니다. – RBarryYoung

+0

예. 프로파일 러와 ExecuteReader가 타이밍에 동의합니다. - 감사합니다! ExecuteReader에 대한 저의 독서로 인해 저는 다음 진술로 넘어 가기 전에 모든 데이터가 반환 될 때까지 기다렸다고 믿었습니다.이 대체 행동이 어디에서 문서화되어 있는지 알고 있습니까? – user2139987

+0

@ user2139987 확인하지는 않았지만 근본적으로 스트림 인 TDS를 반환합니다. 스트림 끝으로 이동하기 오래 전에 데이터를 읽을 수 있습니다. 분명히'SequentialAccess' 모드를 사용할 때 명시 적으로 그렇습니다. 왜냐하면 개별적인 컬럼을 스트림으로 읽는다. 데이터의 끝나기 전에 'out' /'ref' 매개 변수에 액세스하려고하면이 스트리밍 동작의 부작용을 볼 수 있습니다. * last *가 반환됩니다. 긴 선택 후 SQL 오류를 발생시키는 등의 작업을 수행 할 수도 있습니다. 끝나기 전에 판독기를 닫으면 오류가 표시되지 않을 수도 있습니다. –