【问题标题】:SQL Execution preferring scan over seekSQL 执行更喜欢扫描而不是查找
【发布时间】:2018-11-03 23:00:17
【问题描述】:

我正在编写一个简单的查询来查找日期范围。我希望有一个寻求执行计划,但会继续进行扫描。 我已经简化了,但得到了不想要的结果

:

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

【问题讨论】:

  • 请添加 DDL (create table ...)。我们需要弄清楚表的主键、外键、索引和约束是什么。
  • 尝试在日期列上添加非聚集索引来解决问题。

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


【解决方案1】:

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

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

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

如果您确实在 Date 上有一个索引,优化器可能会根据您的表大小决定扫描聚集索引仍然比寻找非聚集索引然后查找来自聚集索引的其他请求的列值。这是另一个迹象,表明您根本没有 Date 上的索引,因为这意味着您在 Id 以外的东西上拥有 Clustered Index。假设您只请求了 Id 和 Date 并且计划执行聚集索引扫描而不是表扫描,这种情况不太可能发生。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-19
    • 2017-06-04
    • 2020-02-16
    • 2023-03-12
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    相关资源
    最近更新 更多