You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:07:53