“WHERE 1=1”通常对查询性能有影响吗?

tra*_*or1 19 performance optimization

我最近看到了“where 1=1 statement”这个问题;为了编写更清晰的代码(从宿主语言的角度),我在构建动态 SQL 时经常使用的 SQL 构造。

一般来说,添加到 SQL 语句中是否会对查询性能产生负面影响?我不是在寻找关于特定数据库系统的答案(因为我已经在 DB2、SQL Server、MS-Access 和 mysql 中使用过它)——除非在不了解细节的情况下不可能回答。

JNK*_*JNK 23

据我所知,所有主要的 RDBMS 都建立在不断的评估中。这应该在其中任何一个中几乎立即评估。

  • 这被忽略了。这与优化器无关,只是根据相关链接连接条件(我的答案也是如此) (2认同)

Mik*_*lsh 8

从 SQL Server 的角度来看,如果您这样做是WHERE 1=1为了允许动态传递参数并跳过正在评估的参数,我建议您阅读 SQL Server MV Erland Sommarskog 中的几篇文章。他的方法不需要在动态 SQL 内部执行一些其他技巧(如WHERE Column = Column构造或使用WHERE (Col = Val OR 1=1) and (Col2 = Val2 OR 1=1)构造)。1=1 不应该像@JNK 提到的那样导致性能问题(我已经在那里 +1 他的答案,这是应该接受的答案),我想你会从 Erland 的文章中找到一些很好的提示动态 SQL,你还会看到他仍然1=1在不传递参数的情况下使用它,但他避免为未传递的单个参数使用它们,他只是不

  • +1 - Erland 是这类事情的首选资源。 (2认同)
  • 对不起。我打错了我的观点。会编辑。我并不是要暗示 Where 1=1 构造存在问题,只是建议其他提高可读性的技巧,并希望避免使用 WHERE (column = value or 1=1) and (column1 = value1 or 1= 1)等方法。 (2认同)

小智 6

使用 MySQL,您可以检查、运行 EXPLAIN EXTENDED 和更高版本的 SHOW WARNINGS 以查看实际查询。tl;dr:它被优化了。

mysql> use test
Database changed
mysql> create table test1(val int);
Query OK, 0 rows affected (0.19 sec)

mysql> explain extended select * from test1 where val > 11 and 1 = 1;
+----+-------------+-------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-------+------+---------------+------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | test1 | ALL  | NULL          | NULL | NULL    | NULL |    1 |   100.00 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)

mysql> show warnings;
+-------+------+--------------------------------------------------------------------------------------------+
| Level | Code | Message                                                                                    |
+-------+------+--------------------------------------------------------------------------------------------+
| Note  | 1003 | select `test`.`test1`.`val` AS `val` from `test`.`test1` where (`test`.`test1`.`val` > 11) |
+-------+------+--------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)
Run Code Online (Sandbox Code Playgroud)