2017-06-12 15 views
1

次のクエリでいくつかのパフォーマンスの問題を修正したいと思います。SQL Serverの大きなデータセットからのフィルタデータのパフォーマンスチューニング

  • TBL_A 65万行
  • を有するTBL_B 2行

を有する私は&に使用しようとしているTBL_B

SELECT COUNT(*) 
FROM Tbl_A R1 WITH (NOLOCK) 
     INNER JOIN Tbl_B PBD 
      ON PBD.Indicators = CASE R1.Indicator WHEN 'Y' THEN 'B' 
               WHEN 'N' THEN 'D'  
               WHEN '1' THEN 'B' 
               WHEN '0' THEN 'D'  
               ELSE R1.Indicator  
          END 

の値でTBL_Aをフィルタリングする必要がある代わりに存在します参加することはできますが、パフォーマンス上のメリットはありません。手伝ってください。

+1

おそらくパフォーマンスは向上しませんが、クエリの改善はWHEN 'と' WHEN 'Y' OR '1' THEN 'B''' WHEN' N 'OR' 0と組み合わせることができます'THEN' D'' –

+0

いいえ動作していません – vignesh

+0

これはn:mの関係だと思いますか? tbl_aでは複数回、tbl_bでは複数回同じ指標を見つけることができますか? –

答えて

3

ここではあまりできないことがあります。もちろん、Tbl_A.IndicatorTbl_B.Indicatorsのインデックスが必要です。関連するインデックスの追加

ALTER TABLE tbl_a ADD pbd_indicator AS (CASE indicator WHEN 'Y' THEN 'B' 
                 WHEN 'N' THEN 'D'  
                 WHEN '1' THEN 'B' 
                 WHEN '0' THEN 'D'  
                 ELSE Indicator  
             END) PERSISTED; 

CREATE INDEX idx_tbl_a_pbd ON tbl_a(pbd_indicator); 

をし、それに応じてクエリを変更します

SELECT COUNT(*) 
FROM tbl_a r1 
INNER JOIN tbl_b pbd ON pbd.indicators = r1.pbd_indicator; 
を私は見性能向上のための

唯一のオプションは、永続化された計算列になります

0

これを試してみてください。case文に参加すると、多くの論理読み込みが行われる可能性があります。代わりに、内部クエリでcase文を使用します。

SELECT COUNT(*) 
FROM (
    SELECT CASE Indicator 
      WHEN 'Y' 
       THEN 'B' 
      WHEN 'N' 
       THEN 'D' 
      WHEN '1' 
       THEN 'B' 
      WHEN '0' 
       THEN 'D' 
      ELSE Indicator 
      END AS Indicator 
    FROM Tbl_b 
    ) R1 
INNER JOIN Tbl_a PBD 
    ON PBD.Indicators = R1.indicator 
+0

結果は同じではありません – vignesh

関連する問題