我想用下面的查询修复一些性能问题。
我需要用Tbl_A的值来过滤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我尝试过使用in &I代替join,但是我找不到任何性能上的好处。请协助。
发布于 2017-06-12 09:53:29
你在这里做不了什么。当然,您应该在Tbl_A.Indicator和Tbl_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;发布于 2017-06-12 09:15:46
尝试一下,连接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.indicatorhttps://stackoverflow.com/questions/44495447
复制相似问题