根据该执行计划截图中的信息,我们可以看到 SQL Server 在执行该查询时使用了 Index Scan (NonClustered)
,这通常表示数据库未能利用索引进行精确查找,因此进行了较大的扫描操作。以下是对每行信息的解释和优化建议。
Index Scan (NonClustered)
解释
-
Physical Operation:
Index Scan (NonClustered)
- 数据库进行了非聚集索引扫描。这意味着查询条件未能充分利用索引,导致扫描了大量的行。
-
Estimated Operator Cost:
19.4038 (94%)
- 该操作占整个查询成本的 94%,表明这是查询的主要性能瓶颈。
-
Estimated I/O Cost:
18.4446
- 估计的 I/O 成本较高,说明扫描了大量的索引数据。高 I/O 成本意味着对磁盘资源的消耗较大,性能可能受影响。
-
Estimated CPU Cost:
0.959219
- CPU 成本虽然不算特别高,但在大数据量下会进一步增加。
-
Estimated Number of Rows to be Read:
1,743,890
- 预计需要读取 1,743,890 行,表示查询扫描了大量的行。
-
Predicate:
- 条件谓词中显示了过滤条件:
OrderStatus = 4 OR OrderStatus = 10
。这意味着查询在OrderStatus
列上进行了过滤,索引未能有效利用。
- 条件谓词中显示了过滤条件:
优化建议
根据以上信息,查询的主要瓶颈是 Index Scan
导致的大量 I/O 和 CPU 成本。以下是优化建议:
1. 创建合适的复合索引
由于查询中的过滤条件涉及多个列,建议创建一个复合索引来覆盖这些条件,从而避免扫描整个索引。以下是一个针对 TrainOrder
表的复合索引示例:
CREATE NONCLUSTERED
标签:Index,NonClustered,Scan,扫描,查询,索引,Estimated
From: https://blog.csdn.net/zybsjn/article/details/143621080