복붙노트

[SQL] 오라클의 OR, 대 한 빠른?

SQL

오라클의 OR, 대 한 빠른?

나는 Oracle 데이터베이스에있는 많은 데이터를 처리하는 응용 프로그램을 개발하고 있어요. 일부 경우에, 나는 조건이 주어진 목록에 따라 많은 개체를 얻을 수 있고, 나는 FROM ... SELECT를 사용 ... WHERE ...에 ...하지만 IN 표현은 크기가 최대 인 목록을 받아 1000 항목.

내가 사용 또는 표현 대신,하지만 난 관찰 그래서 - 아마도이 쿼리 (사용 OR)는 (조건의 동일한 목록)에 비해 느립니다. 맞아? 만약 그렇다면, 어떻게 쿼리의 속도를 향상시키기 위해?

해결법

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

    1.인디애나에 바람직하다 OR - 또는 악명 나쁜 연기자이며, 복잡한 쿼리에 괄호를 사용하여 필요로하는 다른 문제가 발생할 수 있습니다.

    인디애나에 바람직하다 OR - 또는 악명 나쁜 연기자이며, 복잡한 쿼리에 괄호를 사용하여 필요로하는 다른 문제가 발생할 수 있습니다.

    IN 또는 OR, 어느 것보다 더 나은 옵션은 당신이 원하는 (또는 원하지 않는) 값을 포함하는 테이블에 가입하는 것입니다. 비교를 위해이 표는, 일시적으로 파생 된, 또는 이미 스키마에 존재 할 수 있습니다.

  2. ==============================

    2.이 시나리오에서 나는이 작업을 수행 할 것입니다 :

    이 시나리오에서 나는이 작업을 수행 할 것입니다 :

    이 방법 당신은 데이터베이스에 대한 정렬을 떠나 간단한 쿼리를 작성할 수 있습니다.

  3. ==============================

    3.오라클은 내부적으로 그렇게 정말 어떤 성능 차이가 없을 것 어쨌든 관찰 보고서 목록에 목록을 변환합니다. 유일한 차이점은 오라클이 인을 변환해야하지만 당신은 관찰 보고서를 직접 공급하는 경우 구문 분석에 긴 문자열을 가지고 있다는 것입니다.

    오라클은 내부적으로 그렇게 정말 어떤 성능 차이가 없을 것 어쨌든 관찰 보고서 목록에 목록을 변환합니다. 유일한 차이점은 오라클이 인을 변환해야하지만 당신은 관찰 보고서를 직접 공급하는 경우 구문 분석에 긴 문자열을 가지고 있다는 것입니다.

    여기에 당신이를 테스트하는 방법입니다.

    CREATE TABLE my_test (id NUMBER);
    
    SELECT 1 
    FROM my_test
    WHERE id IN (1,2,3,4,5,6,7,8,9,10,
                 21,22,23,24,25,26,27,28,29,30,
                 31,32,33,34,35,36,37,38,39,40,
                 41,42,43,44,45,46,47,48,49,50,
                 51,52,53,54,55,56,57,58,59,60,
                 61,62,63,64,65,66,67,68,69,70,
                 71,72,73,74,75,76,77,78,79,80,
                 81,82,83,84,85,86,87,88,89,90,
                 91,92,93,94,95,96,97,98,99,100
                 );
    
    SELECT sql_text, hash_value
    FROM v$sql 
    WHERE sql_text LIKE '%my_test%';
    
    SELECT operation, options, filter_predicates
    FROM v$sql_plan
    WHERE hash_value = '1181594990'; -- hash_value from previous query
    
  4. ==============================

    4.나는 전체 접근 방식에 의문을 제기한다. SP의 클라이언트는 100000 개 ID를 보낼 수 있습니다. 어디 클라이언트에서 해당 ID를 얻을 수 있습니까? proc 디렉토리의 매개 변수가 크게 어쨌든 대가를 치르게 될 때 ID 같은 많은 수의 전송.

    나는 전체 접근 방식에 의문을 제기한다. SP의 클라이언트는 100000 개 ID를 보낼 수 있습니다. 어디 클라이언트에서 해당 ID를 얻을 수 있습니까? proc 디렉토리의 매개 변수가 크게 어쨌든 대가를 치르게 될 때 ID 같은 많은 수의 전송.

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

    5.당신은 기본 키 테이블을 작성하는 경우 :

    당신은 기본 키 테이블을 작성하는 경우 :

    CREATE TABLE my_test (id NUMBER,
    CONSTRAINT PK PRIMARY KEY (id));
    

    과 값의 여러에 쿼리를 실행하기 위해 동일한에 select 통과, 해시 값을 통해 실행 계획을 검색 한 다음, 당신이 얻을 것은 :

    SELECT STATEMENT
    INLIST ITERATOR
    INDEX                  RANGE SCAN
    

    이것은 당신이 IN 목록을 가지고 있고 PK 컬럼이 사용하는 경우 오히려의 경우 관찰 보고서로 변환보다,이 문제를 처리하는 것이 더 효율적이기 때문에, 오라클은 "INLIST"로 내부적으로 목록을 유지 것을 의미하는 것 미 - 인덱스 테이블.

    나는 위의 오라클 10gR2의를 사용하고 있었다.

  6. from https://stackoverflow.com/questions/6514906/in-vs-or-of-oracle-which-faster by cc-by-sa and MIT license