【发布时间】:2012-10-18 15:05:17
【问题描述】:
我们有一个包含超过 200 万行的表,针对它的所有查询都将是使用 Column1 和 Column2 的 Between 查找。此外,只有一种可能的结果。比如……
Col1 Col2
1 5
6 10
11 15
select * from table1 where 8 between Col1 and Col2
我目前在 Col1 和 Col2 上有一个唯一的聚集索引。到目前为止,我一直无法弄清楚如何进一步调整查询和索引以最小化处理的行。执行计划目前报告在找到唯一正确答案时处理的成本接近 0.5 和 113k 行。
我可能会忽略哪些选项?
根据要求,来自当前执行计划的一些细节:
Operation
Clustered Index Seek
Predicate
CONVERT_IMPLICIT(bigint,[@2],0)<=[Col2]
Seek Predicate
Seek Keys[1]: End: Col1 <= Scalar Operator(CONVERT_IMPLICIT(bigint,[@1],0))
【问题讨论】:
-
写成'select * from table1 where Col1==8'会有帮助吗
-
Col1 中的步长是否始终为 5?如果是这样,那么答案很简单:)
-
你的执行计划是什么样的?您能否将其添加到问题中?
-
Column1和Column2的数据类型是什么?以及如何将 8 的值放入查询中(参数、硬编码等)?
-
嗯,与您发布的 SQL 查询示例相比,您发布的“当前执行计划”看起来非常不同(并且错误)。能否请您发布您的实际 SQL 代码,因为这里不正确。