2014-07-07 2 views
1

나는이 간단한 쿼리를 사용하고 있습니다.날짜 인덱스가있는 ROW_NUMBER() 최적화

SELECT ROW_NUMBER() OVER (PARTITION BY Price_Id ORDER BY date DESC) r, * FROM Samples 

내 문제는 내가 80000 개가 넘는 레코드가 있고 그 쿼리를 수행하는 데 약 3 초가 걸린다는 것입니다. 내 질문에 성능 향상을 위해 할 수있는 일이 있다면?

나는 인덱스의 생각과

CREATE INDEX IX_Samples_Date ON Samples (Date DESC) 

같은 것을 함께했다하지만 내가 전에 인덱스 일한 적이 있고, 위의 내 시도가 작동하지 않았다 인정해야하고 있습니다.

+0

'*'을 제거하고 열 이름을 지정하십시오 (필수) –

답변

2

POC 색인이 필요합니다. 색인 생성 가이드 부분을 SQL Server 2012: How to Write T-SQL Window Functions, Part 3 부분으로보십시오.

그래서 귀하의 경우 색인의 첫 번째 열로 Price_Id을 입력해야합니다.

create index IX_Samples_POC on dbo.Samples(Price_Id, date desc); 

인덱스가 있어도 SQL Server에서 인덱스를 사용한다고 보증 할 수 없습니다. 모든 행과 모든 열을 쿼리하므로 클러스터 된 인덱스 스캔이나 테이블 스캔이 가능할 수도 있습니다. 모두 다른 인덱스가 인덱스에 포함되어있을 가능성이 있습니다 (클러스터형 키가 자동으로 포함됩니다.).

파생 테이블에서 row_number을 사용하고 나머지 열을 반입하는 테이블에 결과를 다시 조인하면 테이블 구조가 어떻게 생겼는지에 따라 인덱스를 사용하는 것이 더 빠를 수 있습니다.

클러스터 키인 기본 키 ID가 있다고 가정하면 이와 비슷한 형태가됩니다.

select S.*, 
     T.r 
from Samples as S 
    inner join (
      select ID, 
        row_number() over(partition by Price_Id 
             order by date desc) as r 
      from dbo.Samples 
      ) as T 
    on S.ID = T.ID; 

또 다른 옵션은 필요한 열을 색인에 포함시키는 것입니다. 아마 실제로 모든 컬럼이 필요할 경우에는 좋은 생각이 아닙니다.

create index IX_Samples_POC on dbo.Samples(Price_Id, date desc) 
    include(Col1, Col2); 

에 모두 인덱스를 사용하지에 비해 커버링 인덱스 사이의 가장 큰 차이점은 SQL 서버를 열거 할 수 있도록 행의 정렬을 할 수 있다는 것입니다. 인덱스는 이미 해당 정렬을 제공합니다.

+0

대단히 감사합니다. – Peter