programing

Oracle의 In vs OR 중 어느 쪽이 더 빠릅니까?

magicmemo 2023. 7. 5. 20:36
반응형

Oracle의 In vs OR 중 어느 쪽이 더 빠릅니까?

저는 오라클 데이터베이스의 많은 데이터를 처리하는 애플리케이션을 개발하고 있습니다.
어떤 경우에는 주어진 조건 목록을 기반으로 많은 물체를 가져와야 하고, 나는 사용합니다.SELECT ...FROM.. WHERE... IN...그러나INexpression은 최대 크기가 1,000개인 목록만 허용합니다.

그래서 사용합니다.OR대신 표현, 하지만 내가 관찰한 바와 같이 -- 아마도 이 쿼리(사용).OR)보다 느립니다.IN(동일한 조건 목록 포함).맞나요?그렇다면 쿼리 속도를 개선하는 방법은 무엇입니까?

IN보다 선호되는OR--OR이는 악명 높은 성능 저하로 인해 복잡한 쿼리에서 괄호를 사용해야 하는 다른 문제가 발생할 수 있습니다.

둘 중 하나보다 더 나은 옵션IN또는OR원하는 값(또는 원하지 않는 값)을 포함하는 테이블에 가입하는 것입니다.비교를 위한 이 테이블은 파생되거나 임시이거나 스키마에 이미 존재할 수 있습니다.

이 시나리오에서는 다음을 수행합니다.

  1. 단일 열 글로벌 임시 테이블 생성
  2. 외부 소스의 목록으로 이 표를 채웁니다(그리고 신속하게 - 다른 전체 토론).
  3. 임시 테이블을 다른 테이블에 결합하여 쿼리를 수행합니다(임시 테이블에는 양호한 통계가 없으므로 동적 샘플링을 고려하십시오).

즉, 데이터베이스에 정렬을 맡기고 간단한 쿼리를 작성할 수 있습니다.

Oracle은 내부적으로 IN 목록을 OR 목록으로 변환하므로 성능 차이가 발생하지 않습니다.유일한 차이점은 Oracle이 IN을 변환해야 하지만 사용자가 직접 OR을 제공하는 경우 구문 분석해야 하는 문자열이 더 길다는 것입니다.

테스트 방법은 다음과 같습니다.

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

문 선택
표 전체 액세스("ID"=1 또는 "ID"=2 또는 "ID"=3 또는 "ID"=4 또는 "ID"=5 또는 "ID"=6 또는 "ID"=7 또는 "ID"=7 또는 "ID"=8 또는 "ID"=9 또는 "ID"=10 또는 "ID"=21 또는 "ID"=22 또는 "ID"=23" 또는 "ID"=28" 또는 "ID"=25"또는 "ID"=42 또는 "ID"=43 또는 "ID"=44 또는 "ID"=45 또는 "ID"=46 또는 "ID"=47 또는 "ID"=48 또는 "ID"=49 또는 "ID"=50 또는 "ID"=51 또는 "ID"=52 또는 "ID"=53 또는 "ID"=54" 또는 "ID"=55 또는 "ID"=57" 또는 "ID"=57"ID"입니다."ID"=73 또는 "ID"=74 또는 "ID"=75 또는 "ID"=76 또는 "ID"=77 또는 "ID"=78 또는 "ID"=79 또는 "ID"=80 또는 "ID"=81 또는 "ID"=82 또는 "ID"=83 또는 "ID"=84 또는 "ID"=85"=85 또는 "ID"="또는 "ID"=89 또는 "ID"=89"

저는 전체적인 접근 방식에 의문을 제기할 것입니다.SP의 고객은 100,000개의 ID를 전송해야 합니다.고객은 어디서 그 신분증을 얻습니까?proc의 매개 변수와 같은 많은 수의 ID를 보내는 것은 어쨌든 상당한 비용이 들 것입니다.

기본 키로 테이블을 만드는 경우:

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

그리고 동일한 SELECT를 통해 여러 IN 값으로 쿼리를 실행한 후 해시 값을 통해 실행 계획을 검색하면 다음과 같은 결과를 얻을 수 있습니다.

SELECT STATEMENT
INLIST ITERATOR
INDEX                  RANGE SCAN

이는 IN 목록이 있고 이 목록을 PK 열과 함께 사용하는 경우 Oracle이 인덱스되지 않은 테이블의 경우처럼 OR로 변환하지 않고 이를 처리하는 것이 더 효율적이기 때문에 내부적으로 "INLIST"로 목록을 유지한다는 것을 의미하는 것으로 보입니다.

저는 위의 Oracle 10gR2를 사용하고 있었습니다.

언급URL : https://stackoverflow.com/questions/6514906/in-vs-or-of-oracle-which-faster

반응형