SQL执行更喜欢扫描搜索

时间:2018-05-24 16:24:59

标签: sql-server tsql sql-execution-plan

我正在编写一个简单的查询来查找日期范围。我期待一个寻求执行计划,但继续扫描。 我已经简化但得到了不受欢迎的结果

Execution plan scan over seek

SELECT p.ID, p.[Date]
FROM PurchaseListT as p
WHERE p.[Date] >= '20180507' AND p.[Date] < '20180524' 

enter image description here

1 个答案:

答案 0 :(得分:2)

在这种情况下,您的日期字段可能没有非聚集索引。

您会注意到您的查询计划显示了群集索引扫描。我怀疑你的聚集索引是在日期字段上,它可能在你的Id字段上。

如果没有Date字段的索引,则引擎无需SEEK。相反,它会通过聚集索引,并为每个条目评估Date值是否适合您的WHERE子句(这是扫描)。

如果你确实在Date上有一个索引,优化器可能已经决定根据你的表大小来扫描聚簇索引比搜索非聚簇索引更快,然后查找来自聚集索引的其他请求的列值。这是另一个迹象,表明您根本没有日期索引,因为这意味着您在Id之外的其他内容上拥有Clustered Index。如果您仅请求了Id和日期而且该计划执行了Clustered Index SCAN而不是表扫描,那么这种情况不太可能发生。