여기서 하나의 실행계획이라는 의미는 '조인순서, 조인방법, 테이블별 액세스방법이 하나'라는 의미이다.
LIKE '%', NVL등을 이용해 하나의 SQL을 작성할 경우 사용자는 oprimizer가 sql조건에 따라 각각 효율적으로 수행되기를 기대한다.
하지만 SQL은 하나의 실행계획으로만 수행되기 때문에 기대했던 것과 달리 때때로 비효율적인 수행을 하게 된다.
LIKE
select t1.*,
t2.*,
t3.*
from t1,
t2,
t3
where t1.c1 like &b1 || '%'
and t1.c2 like &b2 || '%'
and t2.c1 like &b3 || '%'
and t2.c2 like &b4 || '%'
and t3.c1 like &b5 || '%'
and t3.c2 like &b6 || '%'
and t1.no = t2.no
and t1.no = t3.no
and t2.no = t3.no
NVL
select t1.*,
t2.*,
t3
from t1,
t2 t3
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 t3.c1 nvl('&b5', t3.c1)
and t3.c2 nvl('&b6', t3.c2)
and t1.no = t2.no
and t1.no = t3.no
and t2.no = t3.no
패턴 | t1.c1 like :b1 ll '%' | t2.c1 like :b3 ll '%' | t3.c1 like :b5 ll'%' | 테이블 조인 순서 | 1 | O | O | O | T1 -> T2 -> T3 |
---|---|---|---|---|---|---|---|---|---|
2 | O | O | X | T1 -> T2 -> T3 | |||||
3 | O | X | O | T1 -> T3 -> T2 | |||||
4 | O | X | X | T1 -> T2 -> T3 | |||||
5 | X | X | X | T2 -> T3 -> T1 | |||||
: | : | : | : | : |
if :b1 is not null then
select /*+LEADING(t1) USE_NL(t1, t2, t3)*/
..
elsif :b3 is not null then
select /*+LEADING(t1) USE_NL(t1, t2, t3)*/
..
else
select /*+FULL(T1) FULL(T2) FULL(T3) USE_HASH(T1, T2, T3)*/
..
endif;