2016-09-20 20 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を使用しますか?そのフィールドは選択に使用されません –

+0

実行計画を掲載します。 'テーブル1,2&3'で利用可能な' 'インデックス' 'は何ですか? –

+0

このページでSQLを実行してみてください。もしあなたがインデックスを見落としているのであれば、 :http://www.mikesknowledgebase.com/pages/SQLServer/FindingMissingIndexes.htm –

答えて

0

あなたのクエリを使用left JOIN PSP.table3 POが、このテーブルは、サブクエリのSELECTフィールドリストには表示されません。

このテーブルが使用できない場合は、このテーブルを削除して操作できます。

クエリテーブル上のインデックスを確認し、私はあなたがproductIDフィールド

+0

アプリケーションコード –

+0

@Prdpによって動的に追加された 'table3'テーブルの* filters *がある可能性がありますが、table3はLEFT JOINにあります。カットしないでください。行番号を増やす必要があるかもしれませんが、私たちはOPの応答を待つ必要があります –

+0

おそらく行数を増やす可能性がありますが、実際には意味をなさない –

0

ないあなたが値を取得するために集計case式を使用することができ、それはスーパー有益だ場合は必ず、その代わりに、PIVOTの上のようFeatureIdインデックスにあるとしあなたが必要です。 OUTER APPLYを使用すると、3つの列(1つは説明列)でグループ化する必要はありません。

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 
関連する問題