SQL Server 2014查询性能优化:求更高效的替代写法
优化SQL Server 2014统计查询的高效方案
嘿,针对你用SQL Server 2014优化这个双表统计查询的需求,我有几个实用的方案,既能替代你觉得不够优的子查询写法,还能保证统计结果完整,同时提升可读性和扩展性~
方案1:用CROSS JOIN合并独立聚合查询
这种写法把每个表的统计逻辑拆成独立的子查询,再通过CROSS JOIN合并成一行结果,和你原来的标量子查询性能相当,但结构更清晰,后续加新统计项也更方便:
SELECT agg1.Amount1, agg2.Amount2 FROM ( -- 统计TableA的符合条件行数 SELECT COUNT(1) AS Amount1 FROM TableA WITH (NOLOCK) WHERE TIT_DATA_EMISSAO BETWEEN '2017-05-01' AND '2017-05-02' ) AS agg1 CROSS JOIN ( -- 统计TableB的符合条件行数 SELECT COUNT(*) AS Amount2 FROM TableB WITH (NOLOCK) WHERE payment_type IN (300, -1) AND data BETWEEN '2017-05-01' AND '2017-05-02' ) AS agg2
方案2:关键优化——添加覆盖索引
不管用哪种写法,索引优化才是提升查询性能的核心。针对你的查询场景,建议给两个表创建对应的覆盖索引:
给TableA创建索引
CREATE NONCLUSTERED INDEX IX_TableA_TIT_DATA_EMISSAO ON TableA (TIT_DATA_EMISSAO);
这个索引只包含过滤条件用到的TIT_DATA_EMISSAO列,SQL Server可以直接通过索引扫描完成计数,不需要扫描整个表,性能会大幅提升。
给TableB创建索引
CREATE NONCLUSTERED INDEX IX_TableB_payment_type_data ON TableB (payment_type, data);
把payment_type和data作为索引键列,刚好匹配你的WHERE条件,查询时可以直接命中索引,避免全表扫描。
额外注意事项
- 关于
WITH(NOLOCK):它会允许读取未提交的脏数据,如果你的业务场景对数据一致性要求不高(比如后台统计报表)可以保留,否则建议去掉,避免数据不准确。 - SQL Server 2014中,标量子查询和CROSS JOIN聚合的执行计划差异很小,但后者的写法更易维护,后续要加更多统计项(比如第三个表的计数),直接新增一个CROSS JOIN的子查询即可。
内容的提问来源于stack exchange,提问作者Luiz
相关产品推荐
相关产品推荐

