簡體   English   中英

對來自sql server中的大數據集的過濾器數據進行性能調整

[英]Performance tuning on filter data from large data set in sql server

我想用以下查詢修復一些性能問題。

  • Tbl_A有6500萬行
  • Tbl_B有2行

我需要使用Tbl_b的值過濾Tbl_A

 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

我曾嘗試使用in&exists而不是join,但我無法找到任何性能優勢。 請協助。

你在這里做的並不多。 您當然應該在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;

試試這個,加入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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM