2017-06-12 53 views
1

我想修復以下查詢的某些性能問題。從sql server中的大型數據集中篩選數據的性能調整

  • Tbl_A擁有65萬行
  • 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_b的值來過濾Tbl_A exists代替加入,但我無法找到任何性能優勢。請協助。

+1

可能不是性能改進,但可以改善查詢,可以將WHEN作爲'WHEN'Y'或'1'然後'B''''當'N'或'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