MSSQL中SELECT COUNT DISTINCT查询耗时40秒优化求助
SQL查询性能优化方案
- 核心问题分析
你提交的两个查询逻辑完全等价,仅调整查询写法不会改变执行效率,耗时高的根本原因是缺少匹配查询逻辑的覆盖索引,导致执行时需要扫描全表或聚集索引,产生大量IO开销。 - 最优优化方案:创建覆盖型非聚集索引
直接创建完全匹配查询逻辑的覆盖索引,无需回表即可完成所有计算,耗时可降至秒级甚至毫秒级,创建语句如下:
CREATE NONCLUSTERED INDEX IX_Q_Net_Ml_SportsDetailsActivity_monthly_MerchantID_Year_INCLUDE ON Q_Net_Ml_SportsDetailsActivity_monthly (MerchantID, Year, WagerCount) INCLUDE (League, ExternalCustomerID) WITH (ONLINE = ON); -- 生产环境添加ONLINE参数避免锁表影响业务
索引设计逻辑说明:
等值查询条件
MerchantID=584、Year=2021放在索引最前列,可以快速定位到符合条件的数据集前缀;范围过滤条件WagerCount>0紧随其后,可直接在索引层面过滤掉不符合条件的行;最后用INCLUDE语法把需要分组和去重的League、ExternalCustomerID加到索引叶子节点,实现查询100%走索引覆盖,无需访问原表数据。
- 其他补充说明
你之前强制指定的NCSI_Q_Net_Ml_SportsDetailsActivity_monthly索引没有覆盖所有需要的字段,执行时要么需要回表拉取数据,要么需要做额外的排序、哈希去重操作,无法达到最优性能。新索引创建后不需要在查询里加INDEX强制提示,优化器会自动选择最优索引。
内容的提问来源于stack exchange,提问作者Earthcoder
相关产品推荐
相关产品推荐

