다음은 실무에서 서브쿼리를 사용할 경우 주의해야 할 점 또는 성능개선 사례를 중심으로 살펴보자. 아래의 테이블은 서브쿼리 활용사례 샘플 SQL을 만들기 위해 사용되어지는 부서테이블과 사원테이블의 데이터이다.
2.1 서브쿼리의 연결고리 컬럼이 Null 값을 포함하고 있는 경우의 NOT IN, NOT EXISTS
위의 두 샘플 테이블을 가지고 아래의 (가), (나)의 쿼리를 수행할 경우, 언뜻 보기엔 그 결과값이 달라질 것이라고 생각되지 않는다. 그러나, 조인되는 컬럼이 널을 포함하는지의 여부에 따라, 그 결과값은 달라진다.
가)쿼리 결과값으로 50번 부서에 소속된 'MILLER' 사원과 부서코드가 널인 'TURNER' 사원의 정보가 출력되는 반면, 나)쿼리 결과값으로는 50번 부서에 소속된 'MILLER' 사원의 정보만이 출력된다.
위의 두 쿼리문은 부정형 조인으로 모두 확인자 역할의 서브쿼리로 수행된다. 나)쿼리의 경우,사원의 부서번호와 부서테이블의 부서번호가 조인이 수행된후, 조인결과가 같지 않은 값들이 결과로 출력되는데, 이때 널은 조인연산에 참여하지 않으므로 널값의 부서번호는 부서테이블에 조인을 위한 랜덤 엑세스가 발생하지 않는가. 반면, NOT EXISTS는 SUBQUERY 안에 조인조건이 들어가는 경우로 조인컬럼에 NOT NULL constraint 가 걸려 있지 않을 경우 내부적으로 NVL Operator가 수행되어 컬럼의 value가 NULL인 경우에도 비교대상에 포함되어, NOT EXISTS 조건을 만족하면 결과로 출력된다.
'Databases' 카테고리의 다른 글
SQL쿼리 분석시-주요 단축키 (1) | 2007.04.25 |
---|---|
꼭 필요한 tip 몇가지 (1) | 2007.04.25 |
랜덤(Random)한 숫자/문자 생성하기 (0) | 2007.04.25 |
대용량 Import 성능 향상하는 방법 (0) | 2007.04.25 |
자주 쓰는 MySQL 명령어 (1) | 2007.04.25 |