【发布时间】:2015-05-12 01:12:25
【问题描述】:
我有一个包含大约 150 万行的表,其中 date_run 是非集群索引的。查询 #1 需要 0 秒才能完成,查询 #2 需要 3 秒。有人可以解释为什么查询 #2 运行速度较慢。我还包括了两者的执行计划。 Sql 服务器版本 2014。
查询 #1
select avg14gain
from stocktrack
where
date_run >= '2013-3-21'
and date_run < '2013-3-22'
Valid XHTML http://biginkz.com/Pics/DateHardCoded.jpg.
查询 #2
declare @today date
declare @yesterday date
set @today='2013-3-22'
set @yesterday='2013-3-21'
select avg14gain
from stocktrack
where
date_run >= @yesterday
and b.date_run <@today
【问题讨论】:
-
b中的b.date_run是什么? -
是的,但是为什么要进行表扫描呢? date_run 已编入索引。这两个查询实际上是相同的,只是 #1 是硬编码日期,而 #2 是分配的。
-
这与改变基数估计的变量有关。 SQL 并不提前知道该变量是什么,因此它假设扫描表比进行查找和 RID 查找更有效。
-
就@Zane而言,由于优化器在计划编译时不知道变量的值,因此它将依赖相关过滤器的密度向量值来满足第二个查询。在第一个查询中,优化器知道过滤器值,因此可以使用直方图生成估计值。它会根据这些估计来决定哪些操作最有效。
-
感谢您详细说明@swasheck 尝试使用重新编译选项运行。
标签: sql-server date