답변
나는 다음과 같은 간의 성능 차이를 알고 싶어요 가정
WHERE foo IN ('a', 'b', 'c')
WHERE foo = 'a' OR foo = 'b' OR foo = 'c'
을 manual for MySQL에 따르면 값이 일정한 경우 IN
은 목록을 정렬 한 다음 이진 검색을 사용합니다. OR
이 특별한 순서없이 하나씩 평가한다고 생각합니다. 그래서 어떤 상황에서는 IN
이 빠릅니다.
알아두면되는 가장 좋은 방법은 어느 것이 더 빠르는지 확인하기 위해 특정 데이터로 데이터베이스에서 프로파일 링하는 것입니다.
나는 모두 1000000 행을 가진 MySQL에서 시도했다. 열이 인덱싱되면 성능에서 눈에 띄는 차이가 없습니다. 둘 다 거의 즉시입니다. 열이 인덱싱되지 않으면 다음 결과가 나타납니다.
SELECT COUNT(*) FROM t_inner WHERE val IN (1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000);
1 row fetched in 0.0032 (1.2679 seconds)
SELECT COUNT(*) FROM t_inner WHERE val = 1000 OR val = 2000 OR val = 3000 OR val = 4000 OR val = 5000 OR val = 6000 OR val = 7000 OR val = 8000 OR val = 9000;
1 row fetched in 0.0026 (1.7385 seconds)
따라서 OR를 사용하는 방법은 약 30 % 느립니다. 용어를 더 추가하면 차이가 커집니다. 결과는 다른 데이터베이스 및 다른 데이터에서 다를 수 있습니다.
옵티 마이저의 염 가치가있는 경우 옵티마이 저를 수행해야합니다. –
@inflagranti : 안타깝게도 최적화 프로그램이 완벽하지 않습니다. 최적화 도구는 매우 복잡한 프로그램이며 각 구현에는 고유 한 강점과 약점이 있습니다. 그래서 특정 구현에 대해 프로필을 작성해야한다고 말합니다. 나는'IN' 메쏘드의 여분의 구조가 가능한 많은'OR' 절들보다 최적화하는 것이 더 쉽다고 생각합니다. 'OR' 방법이 더 빠른 엔진이 있다면 놀랄 것입니다. 그러나 OR이 느릴 때가 있다는 것에 놀랄 것은 없습니다. –
@ MarkByers 최적화 프로그램은 항상 여러 개의 'OR'을 'IN'으로 대체 할 수 없습니까? – mayu
OR
은 비교할 값이 적을 때 (읽기 쉽도록) 의미가 있습니다. IN
은 유용합니다. 동적 소스가있는 경우에는 값을 비교할 수 있습니다.
또 다른 대안은 JOIN
을 임시 테이블과 함께 사용하는 것입니다.
필요한 인덱스가 있으면 성능이 문제가 될 것이라고 생각하지 않습니다.
가장 좋은 방법은 실행 계획입니다.
나는 오라클와 그것을 시도, 그것은 동일했다. 쿼리 IN
를 사용
CREATE TABLE performance_test AS (SELECT * FROM dba_objects);
SELECT * FROM performance_test
WHERE object_name IN ('DBMS_STANDARD', 'DBMS_REGISTRY', 'DBMS_LOB');
에도 불구하고, 실행 계획은 OR
사용 말한다 :
--------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 8 | 1416 | 163 (2)| 00:00:02 |
|* 1 | TABLE ACCESS FULL| PERFORMANCE_TEST | 8 | 1416 | 163 (2)| 00:00:02 |
--------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("OBJECT_NAME"='DBMS_LOB' OR "OBJECT_NAME"='DBMS_REGISTRY' OR
"OBJECT_NAME"='DBMS_STANDARD')
테스트중인 값이 3 개 이상인 경우 Oracle에서 어떤 일이 발생합니까? ? 오라클이 MySQL과 동일한 바이너리 검색 최적화를 수행 할 수 없거나 두 경우 모두 수행 할 수 있는지 알고 있습니까? –
@Mark Byers : 10 개의 값으로 같은 쿼리를 시도했지만 결과는 같습니다. 참고로, 옵티마이 저가 내 값을 알파벳 순서로 사용했습니다. 오라클이 필터의 내부 최적화를 수행했다면 놀라지 않을 것입니다 ... –
오라클은 또한 'INLIST ITERATOR'연산을 사용합니다.이 연산은 사용할 수있는 인덱스가 있다면 선택합니다. 그래도 시도해 보면 IN과 OR 모두 같은 실행 계획으로 끝납니다. –
나는 오라클이 효율적이지 않은 것을 (다른 쪽이든) 변환 할만큼 똑똑하다고 생각합니다. 그래서 대답은 차라리 각각의 가독성에 달려 있다고 생각합니다. (IN
이 분명히 이긴다고 생각합니다)
OR 연산자는 IN 조건보다 훨씬 복잡한 계산 과정이 필요합니다. 에서.
OR과 함께 사용할 수 있지만 IN과 호환되지 않는 것은 다음과 같습니다 : greater. 크거나 같음, 작음, 작거나 같음, LIKE 및 일부는 ORACLE REGISP_LIKE와 같습니다. 조건이 항상 동일한 값을 비교하지 않을 수도 있습니다.
쿼리 최적화 프로그램의 경우 동일한 값에서 = 연산자를 사용하여 여러 조건에서 OR 연산자를 정의하는 구문이므로 IN 연산자를보다 쉽게 관리 할 수 있습니다. OR 연산자를 사용하면 옵티마이 저가 동일한 값에서 = 연산자를 항상 사용하고 있다고 생각하지 않을 수 있습니다. 더 깊고 복잡한 작업을 수행하지 않으면 아마도 = 관련된 모든 조건에서 동일한 값을 갖는 연산자. 이미 언급 한 이진 검색과 같은 최적화 된 검색 방법을 결과적으로 제외시킵니다.
[편집] 아마 최적화 프로그램이 최적화 된 IN 평가 프로세스를 구현하지 못할 수도 있지만 데이터베이스 업그레이드를 통해 한 번만 수행되는 것을 제외하지는 않습니다. 따라서 OR 연산자를 사용하면 최적화 된 정교화가 사용되지 않습니다.
다수의 OR (350)에서 SQL 쿼리를 수행했습니다. 포스트 그레스는 그것을한다 437.80ms.
지금에 사용 :
23.18ms는
IN 절에 하위 쿼리를 사용 했으므로 그와 완전히 똑같은 것은 아닙니다. – gliljas
- 1. IN vs = where 절에서
- 2. where 절에서 조건을 지정하는 SQL Case 문?
- 3. 추가 Where Where Where SQL 절에서 큰 성능을 얻습니다.
- 4. Where 절에서 SQL Select Count 성능 문제
- 5. SQL 2008 WHERE 절에서 수학이 실패합니다.
- 6. Where 절에서 OR을 얻으려면 어떻게해야합니까?
- 7. LLBL : NOT IN Where
- 8. LINQ to SQL WHERE "IN"
- 9. "WHERE IN"절의 sql 쿼리
- 10. ms-sql 2000의 where 절에서 별칭 열 사용
- 11. GqlQuery의 where 절에서 localtime 사용
- 12. WHERE 절에서 MYSQL GROUP_CONCAT 사용
- 13. Oracle IN 절에서 숫자를 선택하십시오.
- 14. 하위 테이블을 사용하여 WHERE 절에서 MIN SQL 함수를 참조하려면 어떻게합니까?
- 15. SQL Server의 IN 절에서 저장 프로 시저를 호출합니까?
- 16. CakePHP WHERE 절에서 함수 이름을 따옴표로 묶습니다.
- 17. LINQ Where 절에서 컬렉션을 검색하려면 어떻게합니까?
- 18. Where 절에서 인터페이스를 사용하려고하면 L2E가 중단됩니까?
- 19. SQL Server를 중지 WHERE 절에서 쓸모없는 UPPER/LOWER를 평가 하시겠습니까?
- 20. SQL Server - 인덱싱되지 않은 열은 감지하지만 WHERE 절에서 사용됩니다.
- 21. SQL Server 2005 : WHERE 절에서 저장 프로 시저 호출
- 22. SQL 쿼리 WHERE 절에서 일치하지 않는 데이터조차도 선택하는 방법
- 23. WHERE 절에서 NULL에 대한 SQL 검사 (3 진 연산자?)
- 24. SQL where 절에서 동적 값을 추가하지만 작동하지 않습니다.
- 25. SQL SELECT * FROM XXX WHERE where columnName in array
- 26. MySQL - SQL 구문 오류 (WHERE IN UNION)
- 27. SQL WHERE 절의 IN 대 LIKE 선택
- 28. WHERE order in SQL 선택 유지
- 29. IQueryable에서 동적 "WHERE IN"(linq to SQL)
- 30. where 절에서 if 절을 사용할 수 있습니까?
내 첫번째 추측 그렇게이거나 SQL 엔진으로 또는 장면 뒤에 변환하지 않는 한, 더 나은 수행하는 것 . 이 두 쿼리 계획을 보았습니까? – Raj
[MYSQL OR vs IN 성능]의 가능한 복제본 (http://stackoverflow.com/questions/782915/mysql-or-vs-in-performance) –