code

Oracle: 여러 열에 대한 빠른 NOT IN

starcafe 2023. 9. 20. 20:37
반응형

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

반응형