'하나의 SQL은 하나의 실행계획으로만 수행된다.'
=> '조인 순서, 조인 방법, 테이블 별 액세스 방법이 하나' 라는 의미
사용자는 SQL이 다양한 조건에 따라 각각 효과적으로 수행되기를 바라지만
하나의 SQL은 하나의 실행계획으로 수행되기 때문에 사용자의 바람대로 수행되지는 않는다.
[예제 1] LIKE와 NVL을 사용해 하나의 SQL로 작성한 예 |
---|
{code:sql} |
– LIKE
select t1.*
, t2.*
from t1
, t2
where t1.c1 like :b1 || '%'
and t1.c2 like :b2 || '%'
and t2.c1 like :b3 || '%'
and t2.c2 like :b4 || '%'
and t1.no = t2.no
– NVL
select t1.*
, t2.*
from t1
, t2
where t1.c1 nvl(:b1, t1.c1)
and t1.c2 nvl(:b2, t1.c2)
and t2.c1 nvl(:b3, t2.c1)
and t2.c2 nvl(:b4, t2.c2)
and t1.no = t2.no
t1, t2 테이블의 특정 인덱스를 선택 후 NL 조인으로 수행된다면 조회 조건에 어떤 값이 들어갔느냐에 따라
성능 편차가 크게 발생됨.
사용자가 Optimizer에 의해 선택된 인덱스에 해당하는 조건 값을 입력시 빠른 응답을 보이지만,
그렇지 않은 경우 각 테이블의 전체 데이터에 대해 인덱스 스캔을 할 수도 있어 비효율적일 수 있음.
그러므로 다양한 조회 패턴을 가진 SQL은 하나의 SQL로 작성하기 보다는 각 조회 패턴별로 분리해 주어야 함.
|| 패턴 || t1.c1 like :b1 \|\| '%' || t2.c1 like :b2 \|\| '%' || 테이블 조인 순서 ||
| 1 | O | O | t1 -> t2 |
| 2 | O | X | t1 -> t2 |
| 3 | X | O | t2 -> t1 |
| 4 | X | X | t1 -> t2 |