[SQL] 오라클의 OR, 대 한 빠른?
SQL오라클의 OR, 대 한 빠른?
나는 Oracle 데이터베이스에있는 많은 데이터를 처리하는 응용 프로그램을 개발하고 있어요. 일부 경우에, 나는 조건이 주어진 목록에 따라 많은 개체를 얻을 수 있고, 나는 FROM ... SELECT를 사용 ... WHERE ...에 ...하지만 IN 표현은 크기가 최대 인 목록을 받아 1000 항목.
내가 사용 또는 표현 대신,하지만 난 관찰 그래서 - 아마도이 쿼리 (사용 OR)는 (조건의 동일한 목록)에 비해 느립니다. 맞아? 만약 그렇다면, 어떻게 쿼리의 속도를 향상시키기 위해?
해결법
-
==============================
1.인디애나에 바람직하다 OR - 또는 악명 나쁜 연기자이며, 복잡한 쿼리에 괄호를 사용하여 필요로하는 다른 문제가 발생할 수 있습니다.
인디애나에 바람직하다 OR - 또는 악명 나쁜 연기자이며, 복잡한 쿼리에 괄호를 사용하여 필요로하는 다른 문제가 발생할 수 있습니다.
IN 또는 OR, 어느 것보다 더 나은 옵션은 당신이 원하는 (또는 원하지 않는) 값을 포함하는 테이블에 가입하는 것입니다. 비교를 위해이 표는, 일시적으로 파생 된, 또는 이미 스키마에 존재 할 수 있습니다.
-
==============================
2.이 시나리오에서 나는이 작업을 수행 할 것입니다 :
이 시나리오에서 나는이 작업을 수행 할 것입니다 :
이 방법 당신은 데이터베이스에 대한 정렬을 떠나 간단한 쿼리를 작성할 수 있습니다.
-
==============================
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.나는 전체 접근 방식에 의문을 제기한다. SP의 클라이언트는 100000 개 ID를 보낼 수 있습니다. 어디 클라이언트에서 해당 ID를 얻을 수 있습니까? proc 디렉토리의 매개 변수가 크게 어쨌든 대가를 치르게 될 때 ID 같은 많은 수의 전송.
나는 전체 접근 방식에 의문을 제기한다. SP의 클라이언트는 100000 개 ID를 보낼 수 있습니다. 어디 클라이언트에서 해당 ID를 얻을 수 있습니까? proc 디렉토리의 매개 변수가 크게 어쨌든 대가를 치르게 될 때 ID 같은 많은 수의 전송.
-
==============================
5.당신은 기본 키 테이블을 작성하는 경우 :
당신은 기본 키 테이블을 작성하는 경우 :
CREATE TABLE my_test (id NUMBER, CONSTRAINT PK PRIMARY KEY (id));
과 값의 여러에 쿼리를 실행하기 위해 동일한에 select 통과, 해시 값을 통해 실행 계획을 검색 한 다음, 당신이 얻을 것은 :
SELECT STATEMENT INLIST ITERATOR INDEX RANGE SCAN
이것은 당신이 IN 목록을 가지고 있고 PK 컬럼이 사용하는 경우 오히려의 경우 관찰 보고서로 변환보다,이 문제를 처리하는 것이 더 효율적이기 때문에, 오라클은 "INLIST"로 내부적으로 목록을 유지 것을 의미하는 것 미 - 인덱스 테이블.
나는 위의 오라클 10gR2의를 사용하고 있었다.
from https://stackoverflow.com/questions/6514906/in-vs-or-of-oracle-which-faster by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 외래 키 캐스케이드 여러 경로 및주기의 문제는 무엇인가? (0) | 2020.06.15 |
---|---|
[SQL] 같은 테이블의 하위 쿼리와 MySQL을 UPDATE (0) | 2020.06.15 |
[SQL] int 데이터 형식 할 ... NVARCHAR 값을 변환 할 때 변환 실패 (0) | 2020.06.15 |
[SQL] 어떻게 LEFT OUTER은 JOIN 또는 RIGHT OUTER가 오라클에 가입 찾을 가입하기 (+) (0) | 2020.06.15 |
[SQL] 그것은 반복과 비어있는 경우 다른 값이 SQL에 올 때까지 열 값을 하나의 시간을 표시하는 방법 (0) | 2020.06.15 |