복붙노트

[SQL] IN 대 또는 WHERE 절 SQL에

SQL

IN 대 또는 WHERE 절 SQL에

큰 데이터베이스, 더 나은 수행, IN 또는 OR은 SQL에서이 절 다룰 때?

그들이 실행하는 방법에 대한 어떤 차이가 있나요?

해결법

  1. ==============================

    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. ==============================

    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. ==============================

    3.그것이처럼 많은 조건을 동일뿐만 아니라 수 있기 때문에 OR 연산자는 IN 구조보다 훨씬 더 복잡한 평가 과정을 필요로한다.

    그것이처럼 많은 조건을 동일뿐만 아니라 수 있기 때문에 OR 연산자는 IN 구조보다 훨씬 더 복잡한 평가 과정을 필요로한다.

    다음은 OR와 함께 사용할 수있는 무엇을 같이하지만 IN과 호환되지 않는 : 더. 크거나 같음, 이하 작거나 같은 좀 더 추천 오라클 REGEXP_LIKE 동일. 또한 조건이 항상 같은 값을 비교할 수 있다는 것을 고려한다.

    쿼리의 경우 동일한 값에 연산자 = 여러 조건에 OR 연산자를 정의 단지 구조이기 때문에 IN 연산자를 관리하기 쉽게 최적화. 당신은 OR 연산자를 사용하는 경우가 더 깊고 매우 훨씬 더 복잡 정교을 수행하지 않는 경우 옵티마이 저는 아마에만있을 수 있음을 제외 할 수 있습니다, 당신은 항상 같은 값에 = 연산자를 사용하는 것을 고려하지 않을 수 있습니다 = 이미 언급 바이너리 검색과 같은 최적화 검색 방법의 결과의 배제와 모든 관련 조건의 동일한 값에 대한 연산자.

    [편집하다] 아마 최적화는 평가 과정에서 최적화 된 구현하지 수 있지만 한 번에 그것을 (데이터베이스 버전 업그레이드)이 일어날 수 있다는 것을 배제하지 않는다. 당신은 OR 연산자 최적화 정교 귀하의 경우에 사용되지 않습니다 사용한다면.

  4. ==============================

    4.나는 오라클이 다른에 덜 효율적인 하나를 (즉, 중)로 변환하는 스마트 충분하다 생각합니다. 내가 대답을 생각 그래서 (내가 IN이 명확하게 승리라고 생각 임) 각각의 가독성에 따라 다소한다

    나는 오라클이 다른에 덜 효율적인 하나를 (즉, 중)로 변환하는 스마트 충분하다 생각합니다. 내가 대답을 생각 그래서 (내가 IN이 명확하게 승리라고 생각 임) 각각의 가독성에 따라 다소한다

  5. ==============================

    5.비교 적은 값이있을 때 OR (도면의 가독성 지점에서)를 의미한다. IN은 ESP 유용합니다. 당신은 동적 소스에 사용자가 값을 비교하려면이있을 때.

    비교 적은 값이있을 때 OR (도면의 가독성 지점에서)를 의미한다. IN은 ESP 유용합니다. 당신은 동적 소스에 사용자가 값을 비교하려면이있을 때.

    또 다른 대안은 임시 테이블과 조인을 사용하는 것입니다. 나는 성능이 문제한다고 생각하지 않습니다, 당신은 필요한 인덱스를 제공했다.

  6. ==============================

    6.나는 OR (350)의 다수의 SQL 쿼리를했다. 포스트 그레스는 437.80ms 않습니다.

    나는 OR (350)의 다수의 SQL 쿼리를했다. 포스트 그레스는 437.80ms 않습니다.

    이제 IN을 사용합니다 :

    23.18ms

  7. from https://stackoverflow.com/questions/3074713/in-vs-or-in-the-sql-where-clause by cc-by-sa and MIT license