BETWEEN 具有相等限制的 SQL 查询
Posted
技术标签:
【中文标题】BETWEEN 具有相等限制的 SQL 查询【英文标题】:SQL query with equal limits for BETWEEN 【发布时间】:2017-03-09 11:54:42 【问题描述】:假设我有一个查询,
SELECT * FROM tab1 WHERE col1 BETWEEN 111 AND 111;
或查询
SELECT * FROM tab1 WHERE col1=111;
两者在性能上有什么区别吗?
表可以很大,被多次查询。
编辑:查询在 WHERE 子句中最多可以有 15 个字段,例如 col1。此外,列始终是主键的一部分。
【问题讨论】:
什么是表索引列? 第二次查询可能会稍微快一些。是否可测量? 我预计不会有太大的不同——如果有的话。但是,既然可以使用=
,为什么还要使用BETWEEN
?
第二个可能性能更高,但是在这样简单的查询中,引擎应该足够聪明,可以将第一个转换为第二个(实际上,要弄清楚它们是一个并且相同)。 @ypercubeᵀᴹ - 我猜这是一个参数化查询,所以有时它最终会得到 BETWEEN 111 AND 111
。
据我所知没有任何索引。并且该列是键的一部分。原因是该值可能相等也可能不相等。目前我们对这两种情况(相等或不相等)使用不同的查询。我想知道这是否真的有必要。查询最多可以有 15 个这样的列,但始终是键的一部分。
【参考方案1】:
我严重怀疑所写的两个查询是否存在明显差异。真的有两种情况:
col1
上没有索引。两者都会进行全表扫描。第二个将(很可能)对between
进行两次比较而不是一次比较。这不应该引起注意。
col1
上的索引。两者都会使用索引。
比较有趣的案例是:
WHERE col1 BETWEEN 111 AND 111 AND col2 > 0
WHERE col1 = 111 AND col2 > 0
第二个可以充分利用(col1, col2)
上的索引。第二个可能不会。 DB2 可能确实检测到between
限制相同的这种特殊情况。通常,between
在确定索引时被视为不等式。
【讨论】:
以上是关于BETWEEN 具有相等限制的 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章
SQL:基于另一个表设置条件值,具有 BETWEEN 日期条件
DATEDIFF() 或 BETWEEN 用于 SQL 查询中的日期范围