我们有一个包含两百万行的表,其中对它的所有查询将是使用Column1和进行之间的查询Column2。同样,将只有一种可能的结果。例如…
Column1
Column2
Col1 Col2 1 5 6 10 11 15 select * from table1 where 8 between Col1 and Col2
我目前在Col1和上都有一个唯一的聚集索引Col2。到目前为止,我还无法弄清楚如何进一步优化查询和索引,以最大程度地减少所处理的行。执行计划当前报告在查找一个唯一的正确答案时处理了将近0.5行和113k行的成本。
Col1
Col2
我可能会忽略哪些选择?
根据要求,当前执行计划中的一些详细信息:
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))
我想我找到了答案。我必须首先在Col1上创建一个唯一的聚集索引,然后在Col2上创建一个唯一的非聚集索引。然后必须更新查询以在每个索引上强制查找。
select * from table1 where Col1 = (select max(Col1) from table1 where Col1 <= 8) and Col2 = (select min(Col2) from table1 where Col2 >= 8)
执行计划现在报告0.0098成本并处理了1行。