2016-07-20 6 views
0

내가 사용하고 SQL 서버 2008 R2 및 쿼리최적화 행 수 쿼리

select * from 
(  
    select d.ID as ID, 
      .... 
      ....   
      ROW_NUMBER() OVER 
      (
       ORDER BY #some field       
      ) AS RowNum 
    from 
    /*some table*/ 
    LEFT join 
    (select Device_ID,   
      Level,   
      ROW_NUMBER() over (partition by Device_ID order by id desc) as rn 
    from #sometable as de WITH (NOLOCK) 
    where #some condition 
    ) t 
    where t.rn = 1)tmp on ID=tmp.Device_ID **/* sort operation 1*/** 
    /*some more joins */ 
    WHERE /*some condition*/ 
) as DbD 
where RowNum BETWEEN @SkipRowsLocal and (@SkipRowsLocal + @TakeRowsLocal - 1) 
order by RowNum 

내가 샘플 http://blog.sqlauthority.com/2013/04/14/sql-server-tricks-for-row-offset-and-paging-in-various-versions-of-sql-server/

에서 쿼리의 페이지 매김 종류를 구현하기 위해 노력하고 아래했지만, 그것은 매우 느리게 실행 것처럼 보인다 질의 계획을 살펴보면 정렬 작업이 쿼리 시간의 거의 50 %를 소비하고 있으며 기본적으로 임시 테이블에서 1로 표시된 첫 번째 정렬 연산을 추측합니다. 최신 값을 검색하고 바깥 행 번호에서 가져 오려고했습니다. 40 레코드 만 말해.

기본적으로 10K 행을 정렬하고 40 개를 가져 오는 것과 비슷하지만이 쿼리를 개선 할 수있는 방법이 있습니까?

+0

실행 계획 및 테이블 정의 –

+0

색인 DeviceId가 있습니까? 'ORDER BY # some field'이상의 색인 - 일부 필드가 무엇이든간에? – Cato

+0

'where t.rn = 1'을'outer apply (row_number없이 두 번째 것)로 선택하십시오. –

답변

0

왼쪽 결합 대신에 OUTER APPLY를 사용하여 관심있는 장치의 TOP 1을 얻습니다. '첫 번째 테이블에서 레코드를 얻은 다음 해당 레코드로 이동합니다. 당신은 다른 테이블에서 해당 장치 ID의 TOP 1을 얻을 수 있지만, 두 번째 테이블에서, 당신은 그 라인에

select * from 
     (  
     select d.ID as ID, 
        .... 
        ....   
        ROW_NUMBER() OVER 
        (
         ORDER BY #some field       
        ) AS RowNum 
      from 
      /*some table*/ 
      OUTER APPLY 
      (select TOP 1 Device_ID,   
        Level   

         from #sometable as de WITH (NOLOCK) 
         where #some condition and Device_ID = [/*some table*/].id ORDER BY id DESC 
      ) t 
      )tmp 
      /*some more joins */ 
      WHERE /*some condition*/ 
     ) as DbD 
     where RowNum BETWEEN @SkipRowsLocal and (@SkipRowsLocal + @TakeRowsLocal - 1) 
     order by RowNum 

뭔가에 가입하기보다는, 첫 번째 테이블에서 데이터로 검색 할 필요가 있음을 기억 쿼리의 관련 부분 만 빌드하고 비교하려는 경우 정렬을 피하는 것처럼 보이고 인덱스가 빠를 수도 있습니다.