【问题标题】:Performance tuning on filter data from large data set in sql serversql server中大数据集过滤数据的性能调优
【发布时间】:2017-11-13 16:39:48
【问题描述】:

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

  • 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,但我找不到任何性能优势。请帮忙。

【问题讨论】:

  • 可能不是性能改进,而是查询改进,您可以将 WHEN 组合为 WHEN 'Y' OR '1' THEN 'B' WHEN 'N' OR '0' THEN 'D'
  • 不,它不工作
  • 我想这是一个 n:m 关系?我可以在 tbl_a 中多次找到相同的指标,在​​ tbl_b 中多次找到相同的指标?
  • tbl_a 重复且 tbl_b 不同
  • 只有 2 行?是错字吗?

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


【解决方案1】:

在这里您无能为力。当然,您应该在 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;

【讨论】:

    【解决方案2】:

    试试这个,加入 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-14
      • 1970-01-01
      • 2018-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-28
      相关资源
      最近更新 更多