[SQL] IN 대 또는 WHERE 절 SQL에
SQLIN 대 또는 WHERE 절 SQL에
큰 데이터베이스, 더 나은 수행, IN 또는 OR은 SQL에서이 절 다룰 때?
그들이 실행하는 방법에 대한 어떤 차이가 있나요?
해결법
-
==============================
1.난 당신이 다음 사이의 성능 차이를 알고 싶어요 가정 :
난 당신이 다음 사이의 성능 차이를 알고 싶어요 가정 :
WHERE foo IN ('a', 'b', 'c') WHERE foo = 'a' OR foo = 'b' OR foo = 'c'
MySQL을위한 매뉴얼에 따라 값이 상수의 목록을 정렬 한 후 이진 검색을 사용하는 경우. 나는 상상 또는 그들에게 특별한 순서없이 하나 하나를 평가한다. 그래서 IN 빠르게 어떤 상황입니다.
알 수있는 가장 좋은 방법은 빠른있는 확인하기 위해 특정 데이터와 데이터베이스에 모두를 프로파일 링하는 것입니다.
나는 백만 행이 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)
그래서이 경우 방법은 사용 또는 30 % 느린에 관한 것입니다. 용어를 추가하면 차이가 더 큰 있습니다. 결과는 다른 데이터베이스와 다른 데이터에 따라 다를 수 있습니다.
-
==============================
2.찾을 수있는 가장 좋은 방법은 실행 계획에서 찾고있다.
찾을 수있는 가장 좋은 방법은 실행 계획에서 찾고있다.
나는 오라클과 그것을 시도, 그것은 동일했다.
CREATE TABLE performance_test AS ( SELECT * FROM dba_objects ); SELECT * FROM performance_test WHERE object_name IN ('DBMS_STANDARD', 'DBMS_REGISTRY', 'DBMS_LOB' );
쿼리 IN을 사용하더라도, 실행 계획은 사용 또는 말한다 :
-------------------------------------------------------------------------------------- | 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.그것이처럼 많은 조건을 동일뿐만 아니라 수 있기 때문에 OR 연산자는 IN 구조보다 훨씬 더 복잡한 평가 과정을 필요로한다.
그것이처럼 많은 조건을 동일뿐만 아니라 수 있기 때문에 OR 연산자는 IN 구조보다 훨씬 더 복잡한 평가 과정을 필요로한다.
다음은 OR와 함께 사용할 수있는 무엇을 같이하지만 IN과 호환되지 않는 : 더. 크거나 같음, 이하 작거나 같은 좀 더 추천 오라클 REGEXP_LIKE 동일. 또한 조건이 항상 같은 값을 비교할 수 있다는 것을 고려한다.
쿼리의 경우 동일한 값에 연산자 = 여러 조건에 OR 연산자를 정의 단지 구조이기 때문에 IN 연산자를 관리하기 쉽게 최적화. 당신은 OR 연산자를 사용하는 경우가 더 깊고 매우 훨씬 더 복잡 정교을 수행하지 않는 경우 옵티마이 저는 아마에만있을 수 있음을 제외 할 수 있습니다, 당신은 항상 같은 값에 = 연산자를 사용하는 것을 고려하지 않을 수 있습니다 = 이미 언급 바이너리 검색과 같은 최적화 검색 방법의 결과의 배제와 모든 관련 조건의 동일한 값에 대한 연산자.
[편집하다] 아마 최적화는 평가 과정에서 최적화 된 구현하지 수 있지만 한 번에 그것을 (데이터베이스 버전 업그레이드)이 일어날 수 있다는 것을 배제하지 않는다. 당신은 OR 연산자 최적화 정교 귀하의 경우에 사용되지 않습니다 사용한다면.
-
==============================
4.나는 오라클이 다른에 덜 효율적인 하나를 (즉, 중)로 변환하는 스마트 충분하다 생각합니다. 내가 대답을 생각 그래서 (내가 IN이 명확하게 승리라고 생각 임) 각각의 가독성에 따라 다소한다
나는 오라클이 다른에 덜 효율적인 하나를 (즉, 중)로 변환하는 스마트 충분하다 생각합니다. 내가 대답을 생각 그래서 (내가 IN이 명확하게 승리라고 생각 임) 각각의 가독성에 따라 다소한다
-
==============================
5.비교 적은 값이있을 때 OR (도면의 가독성 지점에서)를 의미한다. IN은 ESP 유용합니다. 당신은 동적 소스에 사용자가 값을 비교하려면이있을 때.
비교 적은 값이있을 때 OR (도면의 가독성 지점에서)를 의미한다. IN은 ESP 유용합니다. 당신은 동적 소스에 사용자가 값을 비교하려면이있을 때.
또 다른 대안은 임시 테이블과 조인을 사용하는 것입니다. 나는 성능이 문제한다고 생각하지 않습니다, 당신은 필요한 인덱스를 제공했다.
-
==============================
6.나는 OR (350)의 다수의 SQL 쿼리를했다. 포스트 그레스는 437.80ms 않습니다.
나는 OR (350)의 다수의 SQL 쿼리를했다. 포스트 그레스는 437.80ms 않습니다.
이제 IN을 사용합니다 :
23.18ms
from https://stackoverflow.com/questions/3074713/in-vs-or-in-the-sql-where-clause by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL IN 절 1000 항목 제한 (0) | 2020.03.16 |
---|---|
[SQL] 오라클 SELECT TOP 10 기록 (0) | 2020.03.16 |
[SQL] 어떻게 오라클에서 상위 1을해야합니까? (0) | 2020.03.16 |
[SQL] 어떻게 MySQL의에서 다음 / 이전 기록을 얻으려면? (0) | 2020.03.16 |
[SQL] SQL에서 어떻게 범위에서 당신 "에 의해 그룹"할 수 있습니까? (0) | 2020.03.16 |