Oracle: 여러 열에 대한 빠른 NOT IN
테이블 두 개를 동기화해야 합니다.표에 다음과 같은 열이 있다고 가정합니다.
Table1: A, B, C, D
Table2: A, B, C, E
표 1에서 해당 항목이 없는 행을 찾아야 합니다.(A, B, C)
표 2의 값을 계산한 후 E를 F(D)로 계산하고 표 2를 업데이트합니다.
예를 들어 A와만 일치시켜야 하는 경우 다음과 같은 쿼리를 작성합니다.
SELECT * FROM Table1 WHERE A NOT IN (SELECT A FROM Table2)
다중 열 아날로그가 너무 느린 것 같습니다.
SELECT * FROM Table1 WHERE A NOT IN (SELECT A FROM Table2)
AND B NOT IN (SELECT B FROM Table2)
AND C NOT IN (SELECT C FROM Table2)
그런 쿼리를 작성하는 가장 좋은 방법은 무엇입니까?
두 표에서 (a,b,c)가 NULL이 아닌 경우 NOT IN과 NOT EXISTS 모두 동일한 실행 계획을 생성할 가능성이 높습니다.
(a,b,c)가 null로 선언되지만 실제로 열이 null이 아니라는 것을 알고 있다면 쿼리에 "AND a는 null이 아니며 b는 null이 아니며 c는 null이 아닙니다"를 추가하여 어차피 옵티마이저를 속여서 해시 안티 조인을 수행할 수 있습니다. (하위 쿼리에 /*+ HASH_AJ */ 힌트를 추가해야 할 수도 있습니다.)
또한 다음 쿼리는 동일하지 않습니다.
from table1
where (a,b,c) not in (select a,b,c from table2)
from table1
where a not in(select a from table2)
and b not in(select b from table2)
and c not in(select c from table2)
SELECT * FROM Table1
WHERE (A, B, C) NOT IN
(SELECT A,B,C FROM Table2)
SELECT * FROM Table1
WHERE
not exist (
SELECT 1 FROM Table2
where Table2.a=Table1.a
and Table2.b=Table1.b
and Table2.c=Table1.c )
EDIT : Not Exist와 NOT IN이 완전히 동일하지 않은 경우도 있습니다(NULL 값). http://asktom.oracle.com/pls/asktom/f?p=100:11:0 :::p11_question_id:442029737684를 참조하십시오.
해봐도 좋습니다.
SELECT * FROM Table1
WHERE
not exists (
SELECT 1 FROM Table2
where Table2.a=Table1.a
and Table2.b=Table1.b
and Table2.c=Table1.c );
guigui42에 의해 게시된 바와 같이.해시 조인 안티를 수행하고 필터를 피합니다.
오어트라이
select t1.*
from table1 t1, table2 t2
where t1.a = t2.a(+)
and t1.b = t2.b(+)
and t1.c = t2.c(+)
and (t2.a is null or t2.b is null or t2.c is null);
그러면 외부 조인 + 필터가 수행됩니다.이 두 가지 모두 NOT IN을 하는 것보다 훨씬 더 빠를 것입니다.
작은 부록:NOT IN 절에 둘 이상의 열이 포함되어 있는 경우 Oracle(제 경우 11gR1)이 안티조인 해시를 거부한다는 것을 발견했습니다.
SELECT * FROM Table1 WHERE (A,B,C) NOT IN (
SELECT /*+ HASH_AJ */ A,B,C FROM Table2
WHERE A IS NOT NULL AND B IS NOT NULL AND C IS NOT NULL
)
그리고 이것은 힌트 중 하나를 추가할 때도 마찬가지입니다.UNNEST
) 및 NULL이 아닌 조건.열이 하나일 때만 작동합니다.
성능상의 이유로 절대로 하지 않습니다.
NOT IN (SELECT
사용하다
NOT EXISTS (SELECT 1 FROM
언급URL : https://stackoverflow.com/questions/4345565/oracle-fast-not-in-for-multiple-columns
'code' 카테고리의 다른 글
VBA를 사용하여 SQL 테이블에만 새 레코드 삽입 (0) | 2023.09.20 |
---|---|
Pandas Dataframe에서 빈 항목 또는 NaN 항목 찾기 (0) | 2023.09.20 |
판다 콘캣은 nan 값을 만들어냅니다. (0) | 2023.09.20 |
https://index.docker.io 에 연결하는 동안 네트워크 시간 초과됨 (0) | 2023.09.20 |
창을 사용하여 파일을 다운로드하려면 어떻게 해야 합니까?가져오라고요? (0) | 2023.09.20 |