为只有一个匹配的Between查询索引SQL?

Pat*_*kPL 11 sql indexing between

我们有一个包含超过两百万行的表,其中对它的所有查询都是一个使用Column1和的查找Column2.此外,只有一个可能的结果.例如...

Col1     Col2
1        5
6        10
11       15

select * from table1 where 8 between Col1 and Col2
Run Code Online (Sandbox Code Playgroud)

我目前在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))
Run Code Online (Sandbox Code Playgroud)

Jak*_*ski 7

范围是否始终不重叠?你提到总有一场比赛.如果是,您可以将其写为:

SELECT * FROM table1 
   WHERE 8 <= Col2 
   ORDER BY Col2 ASC
   LIMIT 1
Run Code Online (Sandbox Code Playgroud)

这将为您提供最低值Col2大于8的行 - 这是您感兴趣的范围.仅需要索引Col2,并且成本应该很小.

由于您没有提到您正在使用的DBMS,因此LIMIT 1应该用您用于获取前N个结果的数据库替换.

您必须签Col1 <= your_value入代码以确保您要查找的值确实在该范围内.


Pat*_*kPL 3

我想我已经找到答案了。我必须首先在 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)
Run Code Online (Sandbox Code Playgroud)

执行计划现在报告 0.0098 成本并处理 1 行。