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

如何创建索引消除SalesOrderLineItem表的聚集索引扫描

解决SalesOrderLineItem聚集索引扫描及查询优化方案

1. 修复WHERE子句的索引失效问题

你当前的WHERE子句使用YEAR(SO.SALESORDERDATE) > 2012,这种函数包裹字段的写法会导致SQL Server无法利用SALESORDERDATE上的索引,被迫全表扫描过滤数据。改成直接比较日期常量,让索引能正常生效:

WHERE SO.SALESORDERDATE > '2012-12-31'

2. 创建覆盖索引彻底消除SalesOrderLineItem的聚集索引扫描

你之前创建的索引只包含了连接字段,但需要确保索引覆盖查询中从SLI表读取的所有列(无需回表访问聚集索引)。先删除旧索引,再创建针对性的覆盖索引:

DROP INDEX IF EXISTS IDX ON SALESORDERLINEITEM;
GO
CREATE NONCLUSTERED INDEX IDX_SLI_Covering 
ON SALESORDERLINEITEM (SALESORDERID, PRODUCTID, PROMOTIONID);
GO

这个索引包含了SLI表中查询用到的所有列:

  • SALESORDERID:关联SALESORDER表的连接字段
  • PRODUCTID:关联PRODUCT表的连接字段
  • PROMOTIONID:聚合计算(SUM CASE)用到的字段

SQL Server可以直接通过该索引获取所有所需数据,无需再访问聚集索引,彻底消除聚集索引扫描。

3. 优化关联表索引提升整体效率

为SALESORDER表创建针对过滤条件的覆盖索引,加快订单数据的过滤和连接:

CREATE NONCLUSTERED INDEX IDX_SO_SalesDate 
ON SALESORDER (SALESORDERDATE)
INCLUDE (SALESORDERID, SALESREGIONID);
GO

该索引让SQL Server快速定位2012年后的订单,同时直接获取连接所需的SALESORDERID和SALESREGIONID,避免回表操作。

另外确保其他关联表(PRODUCT、SALESREGION、REGION等)的主键字段(如PRODUCTID、SALESREGIONID)已创建主键/唯一索引,这些索引是表连接的基础保障。

4. 验证优化效果

创建完上述索引后,重新执行查询并查看执行计划:

  • 确认SalesOrderLineItem的操作变为索引扫描或索引查找,聚集索引扫描彻底消失
  • 查看整体查询成本和执行时间,应该会进一步降低

内容的提问来源于stack exchange,提问作者dwewers

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 11:24:29