2009-08-06 6 views
1

이러한 쿼리가 잠재적으로 최적화 될 수 있는지 궁금합니다. 필자는 그것을 크게 단순화했으며, 핵심을 본다.SQL Server 2005의 SQL 쿼리 최적화 (CTE + 범위 함수)

with Rec (Id,Name,ParentId) 
as 
(
    select Id,Name,ParentId from Departments where ParentId is null 
    union all 
    select d.Id, d.Name, d.ParentId from Departments d join Rec r on 
    (d.ParentId=r.Id) 
) 
select q.* from (
select ROW_NUMBER() OVER (ORDER BY r.Id DESC) AS [ROW_NUMBER], r.* from Rec r 
) as q 
where q.[ROW_NUMBER] between 100 and 200 

중요한 작업은 계층 적으로 해당 부서를 쿼리 한 다음 해당 작업을 수행하는 것입니다.

거대한 실행 계획으로 끝나고 다른 방식으로 수행 할 수 있는지 궁금합니다.

감사합니다.

답변

1

는 나는 다음과 같은 가정을 주어 조금 더 좋을 수 quess :

  1. 당신은 ParentId에 의해 적절한 인덱스가
  2. 당신은 많은 양의 데이터를 검색 할 테이블에서 (열 대부분의)

할 수있는 일 : io 서브 시스템의로드를 줄이기 위해 먼저 ID의 목록을 구성하고 페이지를 작성 (예 : RowNumber로 필터링) 한 다음 다른 모든 열을 포함시킵니다. 위의 두 가지 가정을 감안할 때 ParentId의 인덱스 작업을 효과적으로 수행 할 수 있습니다.

그래서 여기에 '직접'내 제안이다 그래서 대답 : 돕는

with Rec (Id,ParentId) 
as 
(
    select Id,ParentId from Departments where ParentId is null 
    union all 
    select d.Id, d.ParentId from Departments d join Rec r on 
    (d.ParentId=r.Id) 
), 
Paged 
as 
(
    select * from (
     select ROW_NUMBER() OVER (ORDER BY r.Id DESC) AS [ROW_NUMBER], r.* from Rec r 
    ) as q 
    where q.[ROW_NUMBER] between 100 and 200 
) 
select * 
from 
    Paged 
    inner join Departments d on d.Id = Paged.Id 
+0

알렉스, 감사합니다. 이미 내 ParentId가 인덱싱되어 있고 내 옵션이 0.21 하위 트리 비용을 산출하지만 내 옵션은 0.17입니다. – Valentin

+0

변경 사항이 도움이되지 않습니다. 저는이 단순화 된 사례 또는 원본 (복잡한, 실제) 쿼리에 대해 하위 트리의 비용을 비교 했습니까? 나는 결과가 크게 다를 수 있다고 생각한다. – AlexS