对 sql 服务器中的大型数据集的过滤数据进行性能调整
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,但我找不到任何性能优势。请协助。
试试这个,加入 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
您在这里无能为力。你当然应该在 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;
我想解决以下查询的一些性能问题。
- 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,但我找不到任何性能优势。请协助。
试试这个,加入 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
您在这里无能为力。你当然应该在 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;