2012-03-15 3 views
4

은 좀 기존 SQL (SP) 2 만 행 이상SQL Server 2005의 표 스풀 (게으른 스풀) - 성능

declare @FactorCollectionId  int;  select @FactorCollectionId = collectionID from dbo.collection where name = 'Factor' 
    declare @changeDate    datetime; set @changeDate = getDate() 
    declare @changeTimeID   int;  set @changeTImeID = convert(int, convert(varchar(8), @changeDate, 112)) 
    declare @MaxWindowID   int;  select @MaxWindowID = MAX(windowID) from dbo.window 

    select distinct @FactorCollectionId, ElementId, T.TimeID, @changeTimeId ChangeTimeID, 1 UserID, @MaxWindowID, 0 ChangeID 
          , null TransactionID, SystemSourceID, changeTypeID, 'R' OlapStatus, Comment, Net0 Delta0, Net0 
          , 1 CreatedBy, 1 UpdatedBy, @changeDate CreatedDate, @changeDate UpdatedDate, 1 CurrentRecord, MeasureTypeID 
       from dbo.aowCollectedFact FV 
        inner join dbo.timeView T on T.timeID >= FV.timeID 
       where FV.currentRecord = 1        --is current record 
        and T.CurrentHorizon <> 0       --Indicator that Time is part of current horizon 
        and FV.collectionID = @FactorCollectionId   --factor collections only 
        and FV.timeID = (select MAX(timeID)    --latest collected fact timeID for given collectionID and elementID 
             from aowCollectedFact FV2 
             where FV2.collectionId = @FactorCollectionId 
              and FV2.elementId = FV.elementID) 
        and (((T.ForecastLevel = 'Month') and (T.FirstDayInMonth = T.Date))  --Date is first of month for monthly customers, or 
          or 
         ((T.ForecastLevel = 'Quarter')and (T.FirstDayInQuarter = T.Date))) --Date is first of quarter for quarterly customers 
        and not exists (select 1            --Record does not already exist in collected fact view 
            from aowCollectedFact FV3       -- for this factor collection, elementID, and timeID 
            where FV3.collectionId = @FactorCollectionId 
             and FV3.elementID = FV.elementId 
             and FV3.timeID = T.timeID) 

이 SQL 프로세스를 가지고있다. 그 성능을 향상시켜야합니다. 실행 계획을 살펴보면 Table Spool (Lazy spool) 작업에 많은 시간이 소비된다는 것을 알 수 있습니다 (인덱스는 테이블에 존재하며 잘 작동합니다).

이 부분의 성능을 향상시키는 방법은 무엇입니까?

+0

실제 성능, 시간 또는 디스크 IO를 알려주십시오. 또한 실행 계획 – Lamak

+1

을 게시 할 수 있습니다. 또한 테이블에있는 인덱스와 사용중인 실제 실행 계획을 확인할 수 있습니까? – MatBailie

+0

+1 좋은 질문입니다. 1k 이상 표시 – Malachi

답변

8

실행 계획 또는 테이블 인덱스를보기 전에 나는 가장 교육 된 추측을 제공 할 것입니다. 먼저, 읽을 가치가있는 몇 개의 링크가 있습니다.

Table spool/Lazy spool

INDEXING

showplan operator of the week - lazy spool

: 물론 그들은 모두 당신이 테이블에서 선택하고있는 열을 포함하고 있는지 확인하기 위해 지표를 살펴 보자. 인덱스 내의 JOIN 및 WHERE 절에 포함 된 모든 열을 가져 오려고하는 것이 좋습니다. SELECT.에있는 다른 모든 C 럼은 인덱스에 의해 INCLUDE되거나 포함되어야합니다.

운영자 : 연산자가 같지 않음 ("<>") 연산자를 제거 할 수 있는지 확인하십시오.보다 큰 연산자 또는 작은 연산자를 선호합니다. 이 명세서 and T.CurrentHorizon <> 0and T.CurrentHorizon > 0으로 바꿀 수 있습니까?

JOINS : 외부 테이블에 조인하는 하위 쿼리를 제거하십시오. 예를 들어이 줄 and FV2.elementId = FV.elementID은 몇 가지 문제를 일으킬 수 있습니다. 이미 메인 쿼리에서 GROUPING (DISTINCT)을하고 있다면 서브 쿼리에서 빠져 나가서 JOIN을 dbo.aowCollectedFact FV으로 옮길 이유는 없습니다.

DISTINCT : GROUP BY로 변경하십시오. 나는 좋은 연습이고 2 분이 걸리기 때문에 이유가 없다.

마지막 참고 : 위의 모든 예외는 최종 하위 쿼리 인 IF NOT EXISTS을 하위 쿼리로 남겨 둘 수 있습니다. JOIN으로 변경하면 실제로는 스풀링 조작을 일으킬 수있는 LEFT JOIN...WHERE NULL 문이어야합니다. 그 중 하나를 해결할 수있는 좋은 방법이 없습니다.

+0

감사합니다 Norla, 실행 계획에 파일을 첨부하는 방법? –

+1

@cleric 실행 계획은 xml 파일로 내보낼 수 있습니다. 코드 세그먼트로 복사하여 붙여 넣을 수 있습니다. 아마 더 나은 방법은 그것을 할 수 있지만 ... –

+0

XML의 실행 계획은 너무 길기 때문에 여기에 넣으려고합니다. 참고 SQL Server 2005 버전은 XML로 내보낼 수 없습니다. 2008 년에했습니다. :) SQL Server 2008에는 "Missing Index Details."라는 멋진 기능이 있습니다. 좋은 물건 –