作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们有一个包含超过 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 8 <= Col2
ORDER BY Col2 ASC
LIMIT 1
这将为您提供具有最低值 Col2
的行高于 8 - 这是您感兴趣的范围。仅在 Col2
上需要索引。 ,而且成本应该很小。
由于您没有提及您正在使用的 DBMS,因此LIMIT 1
应替换为数据库用于获取前 N 个结果的任何内容。
您必须检查Col1 <= your_value
代码中以确保您要查找的值确实在范围内。
关于sql - 为只有一个匹配项的 Between 查询建立索引 SQL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12957781/
我是一名优秀的程序员,十分优秀!