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 日期条件

SQL 日期格式 BETWEEN 查询

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

DATEDIFF() 或 BETWEEN 用于 SQL 查询中的日期范围

了解在 SQL 查询的自联接中使用“Between”条件时的逻辑查询处理

具有限制和偏移量的 CodeIgniter sql 查询未显示结果