Oracle의 In vs OR 중 어느 쪽이 더 빠릅니까?
저는 오라클 데이터베이스의 많은 데이터를 처리하는 애플리케이션을 개발하고 있습니다.
어떤 경우에는 주어진 조건 목록을 기반으로 많은 물체를 가져와야 하고, 나는 사용합니다.SELECT ...FROM.. WHERE... IN...
그러나IN
expression은 최대 크기가 1,000개인 목록만 허용합니다.
그래서 사용합니다.OR
대신 표현, 하지만 내가 관찰한 바와 같이 -- 아마도 이 쿼리(사용).OR
)보다 느립니다.IN
(동일한 조건 목록 포함).맞나요?그렇다면 쿼리 속도를 개선하는 방법은 무엇입니까?
IN
보다 선호되는OR
--OR
이는 악명 높은 성능 저하로 인해 복잡한 쿼리에서 괄호를 사용해야 하는 다른 문제가 발생할 수 있습니다.
둘 중 하나보다 더 나은 옵션IN
또는OR
원하는 값(또는 원하지 않는 값)을 포함하는 테이블에 가입하는 것입니다.비교를 위한 이 테이블은 파생되거나 임시이거나 스키마에 이미 존재할 수 있습니다.
이 시나리오에서는 다음을 수행합니다.
- 단일 열 글로벌 임시 테이블 생성
- 외부 소스의 목록으로 이 표를 채웁니다(그리고 신속하게 - 다른 전체 토론).
- 임시 테이블을 다른 테이블에 결합하여 쿼리를 수행합니다(임시 테이블에는 양호한 통계가 없으므로 동적 샘플링을 고려하십시오).
즉, 데이터베이스에 정렬을 맡기고 간단한 쿼리를 작성할 수 있습니다.
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
'programing' 카테고리의 다른 글
셀 내의 16진수 색상 값을 사용하여 셀을 강조 표시하는 방법은 무엇입니까? (0) | 2023.07.05 |
---|---|
값 오류:이 시트는 너무 큽니다!시트 크기는 1220054, 3 최대 시트 크기는 1048576, 16384입니다. (0) | 2023.07.05 |
아랍어 문자가 포함된 CSV 파일이 Excel에서 기호로 표시됩니다. (0) | 2023.07.05 |
메이븐의 "maven find symbol" 오류 (0) | 2023.07.05 |
iPhone Safari 웹 앱이 새 창에서 링크를 엽니다. (0) | 2023.07.05 |