对来自sql server中的大数据集的过滤器数据进行性能调整

时间:2017-06-12 09:04:48

标签: sql performance sql-server-2014 sqlperformance sql-tuning

我想通过以下查询解决一些性能问题。

  • 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&存在而不是加入,但我找不到任何性能优势。请协助。

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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