2016-09-20 4 views
0

다음과 같이 저장 프로 시저에서 피벗 작업을 수행하고 있지만 성능에 영향을 미치며 보고서에 사용하고 있습니다.SQL - 피벗 쿼리 성능 향상

성능 향상을 위해이 피벗 연산을 대체 할 수 있습니까? 또는이 인덱스를 적용 할 수 있습니까?

SELECT colId,colSequence,colDescription, 
ISNULL([1],0) AS 'IESO',ISNULL([2],0) AS 'RFRC',ISNULL([3],0) AS 'EAL',ISNULL([4],0) AS 'HNS',ISNULL([5],0) AS 'PTE',ISNULL([6],0) AS 'EOC',ISNULL([7],0) AS 'MU' 
FROM 
( 
SELECT PF.FeatureId,PF.Sequence,PF.[Description],PTB.BenefitId, 
FROM PSP.table1 PF 
LEFT JOIN PSP.table2 PTB ON PF.FeatureId = PTB.FeatureId 
left JOIN PSP.table3 PO ON PO.productID = PF.productId 
WHERE PF.ProductId = @ProductId AND PF.IsDeleted = 0 

) PS 
PIVOT 
( 
MAX (BenefitId) 
FOR BenefitId IN 
([1],[2],[3],[4],[5],[6],[7]) 
) AS pvt 
ORDER BY colSequence 
+1

왜 하위 쿼리에서 PO를 사용합니까? 그 필드는 select –

+0

에 사용되지 않습니다. 실행 계획을 게시하십시오. 'table 1,2 & 3'에서 사용 가능한'인덱스 '는 무엇입니까 –

+0

이 페이지에서 SQL을 실행하여 어떤 인덱스가 누락되었는지 확인할 수 있습니다 (그렇다면 성능에 어떤 영향을 미칠지) : http://www.mikesknowledgebase.com/pages/SQLServer/FindingMissingIndexes.htm –

답변

0

쿼리 사용 left JOIN PSP.table3 PO하지만이 테이블은 하위 쿼리의 SELECT 필드 목록에 표시되지 않습니다.

이 테이블을 사용할 수 없다면 제거 할 수 있으므로 작업을 수행 할 수 있습니다.

쿼리 테이블에

확인을 인덱스,하지만 난 당신이 productID 필드로 FeatureId 인덱스에 있다고 가정은 매우 유익하지만 대신 PIVOT 당신이 값을 얻을 수 집계의 경우 표현식을 사용할 수있는 경우

+0

응용 프로그램 코드 –

+0

@Prdp를 통해 동적으로 추가 된'table3' 테이블의 필터 *가있을 수 있지만 table3은 LEFT JOIN에 있습니다. 자르지 마. 어쩌면 행 번호를 늘릴 필요가 있을지 모르지만 OP의 응답을 기다려야합니다. –

+0

아마도 행 수를 늘릴 수는 있지만 실제로는 의미가 없습니다. –

0

확실하지 너는 필요해. OUTER APPLY를 사용하여 3 열 (하나는 설명 열)별로 그룹화하지 않아도됩니다.

SELECT colId   = PF.FeatureId, 
     colSequence  = PF.Sequence, 
     colDescription = PF.[Description], 
     PTB.* 
FROM PSP.table1 PF 
     OUTER APPLY (
      SELECT 'IESO' = COUNT(CASE WHEN BenefitId = 1 THEN 1 END), 
        'RFRC' = COUNT(CASE WHEN BenefitId = 2 THEN 1 END), 
        'EAL' = COUNT(CASE WHEN BenefitId = 3 THEN 1 END), 
        'HNS' = COUNT(CASE WHEN BenefitId = 4 THEN 1 END), 
        'PTE' = COUNT(CASE WHEN BenefitId = 5 THEN 1 END), 
        'EOC' = COUNT(CASE WHEN BenefitId = 6 THEN 1 END), 
        'MU' = COUNT(CASE WHEN BenefitId = 7 THEN 1 END) 
      FROM PSP.table2 PTB 
      WHERE PF.FeatureId = PTB.FeatureId 
     ) PTB 
WHERE PF.ProductId = @ProductId 
     AND PF.IsDeleted = 0