“WHERE 1 = 1”은 일반적으로 쿼리 성능에 영향을 줍니까?


19

나는 최근에 "where 1 = 1 statement"라는 질문을 보았다 ; 호스트 언어의 관점에서 더 깨끗한 코드를 작성하기 위해 동적 SQL을 구성하는 데 자주 사용하는 SQL 구문.

일반적으로 SQL 통계에 이러한 추가가 쿼리 성능에 부정적인 영향을 미칩니 까? 특정 데이터베이스 시스템과 관련하여 답변을 찾고 있지 않습니다 (DB2, SQL Server, MS-Access 및 mysql에서 사용했기 때문에). 특정에 빠지지 않고 대답 할 수 없다면.


4
나는 어떤 옵티마이 저가 그러한 간단한 조건을 처리 할 수 ​​있고 그것을 단순히 무시할 수 있다고 믿기 때문에 최종 실행 계획에는 전혀 포함되지 않을 것입니다

논리적으로 말하면 일반적으로 쿼리 최적화 프로그램이 단순히 쿼리를 무시한다는 것이 의미가있는 것 같습니다.

6
당신은 실행이 wtih 및없이 계획을 비교할 수1=1
뤽 M

4
@ Luc M : SQLite를 위해 그 일을했습니다. 그것이 WHILE 1=1절을 최적화하지 않는 것으로 나타났습니다 . 그러나 실행 시간에 영향을 미치지 않는 것 같습니다.
dan04

답변:


23

내가 아는 한 모든 주요 RDBMS는 지속적으로 평가하고 있습니다. 이것은 어느 것에서 나 거의 즉각적으로 평가되어야합니다.


+1 이것은 제 추측이기도했지만 제가 질문 한 이유는 좀 더 자세하게 설명하기 위해서였습니다. 입력이 더 있는지 확인하기 위해 조금 더 길게 열겠습니다.
트랜지스터 1

2
이것은 무시됩니다. 그냥 CONCAT 곳 condituon 해당 링크 (너무 내 대답)에 따라의, 옵티마이와에 불과하다
GBN

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매개 변수가 전달되지 않은 경우 에도 여전히 매개 변수를 사용하지만 전달되지 않은 개별 매개 변수에 대해서는 피할 수 있습니다.


(필자는 순간 2008 SP1에 대한 코드를 작성하고 있지 않다 때문에) 그냥 두 번째 기사를 검색 해요,하지만 난 그가 볼 수 있습니다 자신의 코드에 1 = 1을 사용. 나는 이미 sp_executesql에 익숙하지만, 그 자체로 1 = 1을 사용하는 푸시를 제거하지는 않습니다. 어쩌면 내가 뭔가를 놓치고 있습니까?
트랜지스터 1

2
+1-Erland는 이런 종류의 자원입니다.
JNK

두 번째 링크에서 인용하면 : "19-29 행에서 기본 SQL 문자열을 작성합니다. 29 행의 WHERE 1 = 1 조건은 사용자가 매개 변수를 지정하지 않고 프로 시저를 호출 할 수있게합니다."
트랜지스터 1

2
죄송합니다. 요점을 잘못 입력했습니다. 편집합니다. Where 1 = 1 구문에 문제가 있음을 의미하는 것은 아니며 가독성에 대한 다른 팁을 제안하고 WHERE (열 = 값 또는 1 = 1) 및 (열 1 = 값 1 또는 1 = 1) 등 접근.
Mike Walsh

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)

1
좋은 대답입니다. Btw MySQL 서버 v5.7.18에서는 'EXTENDED'가 더 이상 사용되지 않으며 향후 릴리스에서 제거 될 예정입니다. mysql doc에서 : In older MySQL releases, extended information was produced using EXPLAIN EXTENDED. That syntax is still recognized for backward compatibility but extended output is now enabled by default, so the EXTENDED keyword is superfluous and deprecated. Its use results in a warning, and it will be removed from EXPLAIN syntax in a future MySQL release.MySQL v 8.0에서 제거되었습니다.
mikep
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.