C#,Delphi,Oracle,MSSQL 개발자블로그

[Oracle] 오라클 EXISTS함수, NOT EXISTS, MINUS 본문

Programming/Oracle

[Oracle] 오라클 EXISTS함수, NOT EXISTS, MINUS

19760323 2017. 3. 12. 18:58

오라클 EXISTS함수, NOT EXISTS, MINUS 함수

 

1. 오라클 NOT IN, NOT EXISTS, MINUS의 효과적인 튜닝방법 

- 데이터 제한 조건은 인덱스를 사용 

- 데이터 불러오는 양을 적게한다.
- 사용자 ORACLE FUNCTION은 자제
- 무조건 FULLTABLESCAN(이하 FTS)이 나쁜것은 아님
- NOT IN보다는 IN사용 권장
- NOT EXISTS 보다는 EXISTS사용 권장
- UNION보다는 UNION ALL사용 권장

 

 

2. EXISTS 실행조건

2.1 EXISTS 조건은 subquery 에 해당하는 row가 적어도 한 개 이상 존재할 경우가 충족되는 경우 SELECT가 실행된다.
2.2 EXISTS 조건은 유효한 SQL 문장인 select, inset, update, delete 에서 사용 가능 하다.
2.3 형식

 SELECT COLUMNS
FROM TABLES
WHERE EXISTS ( subquery );

 

2.4 예

 SELECT *
  FROM suppliers
 WHERE EXISTS (SELECT *
                 FROM orders
                WHERE suppliers.supplier_id = orders.supplier_id);서브쿼리 조건에 만족하는 모든 레코드를 반환 한다.

 

 

3. NOT EXISTS 실행예

SELECT *
  FROM suppliers
 WHERE NOT EXISTS (SELECT *
                     FROM orders
                    WHERE suppliers.supplier_id = orders.supplier_id);suppliers.supplier_id = orders.supplier_id 일치 하지 않는 suppliers의 레코드를 반환 한다. 

 


4. Exists 와 IN 차이점

 - EXISTS : 단지 해당 row가 존재하는지만 확인하고, 더 이상 수행되지 않는다.
 - IN : 실제 존재하는 데이터들의 모든 값까지 확인한다.
 - 일반적인 경우에 EXISTS가 더 좋은 성능 나타내므로, 사용을 권장 한다.

 - NOT IN을 사용하면 조건에 맞는 데이터가 있다고 하더라도 NULL 이 존재하면 “no rows selected”라고 나오게 된다. 따라서 NVL를 이용한 NULL 처리가 꼭 필요하다.

 

 SELECT product_type_id, name
FROM product_types
WHERE product_type_id NOT IN
  (SELECT NVL(product_type_id, 0) FROM product);

 



출처: http://javafactory.tistory.com/entry/오라클-EXISTS함수-NOT-EXISTS-MINUS [Elite JAVA 개발자의 저장소]

Comments