tra*_*or1 19 performance optimization
我最近看到了“where 1=1 statement”这个问题;为了编写更清晰的代码(从宿主语言的角度),我在构建动态 SQL 时经常使用的 SQL 构造。
一般来说,添加到 SQL 语句中是否会对查询性能产生负面影响?我不是在寻找关于特定数据库系统的答案(因为我已经在 DB2、SQL Server、MS-Access 和 mysql 中使用过它)——除非在不了解细节的情况下不可能回答。
JNK*_*JNK 23
据我所知,所有主要的 RDBMS 都建立在不断的评估中。这应该在其中任何一个中几乎立即评估。
从 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
在不传递参数的情况下使用它,但他避免为未传递的单个参数使用它们,他只是不
小智 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)