首先,我很抱歉,如果这个问题是很常见的。我似乎无法找到正确的字词进行搜索......查询优化
我有了一个增量有点大表ID和一个插入的值datetime
。其上有几个索引,包括ID
上的主键和插入时间和ID的非聚集索引。所以,当我写类似下面的查询,这是非常快:
select min(ID), max(ID)
from tbl
where inserted between '2015-10-07' and '2015-10-08'
但是,如果我variablize where子句条件(如下),这是相当慢一点:
declare @sTime datetime, @eTime datetime
select @sTime = '2015-10-07', @eTime = '2015-10-08'
select min(ID), max(ID)
from tbl
where inserted between @sTime and @eTime
当我看看两个查询计划,我发现显而易见的问题。第一个查询在插入的时间和ID的非聚集索引上使用单个seek
。但是,第二个查询改为在主键上执行2 scans
(这只是ID)。
所以,我的问题是双重的:
- 为什么SQL Server执行这些优化,并
- 我该如何解决?
[参数](http://www.sommarskog.se/query-plan-mysteries.html#varparamreplace)得到的独立查询是完全不同的,SQL Server可以使用常量进行**更准确的估计的变量**,因此得出一个更好的计划。您可以尝试强制使用与[计划指南](http://www.sommarskog.se/query-plan-mysteries.html#planguides) – lad2025
不同的计划。简单的说就是根据数据范围查询优化器必须在索引查找与索引扫描。 – lad2025
@ lad2025,虽然我不认为参数链接与我的场景(这不是存储过程)有任何关系,但它听起来像'选项(重新编译)'应该在MSSQL 2008和更新的版本中工作...这至少意味着有一个合理的解决方案前进...... – chezy525