안녕하세요
a라는 테이블과 c라는 테이블을 조인을 걸어 데이터를 가져오는 관계입니다.
a.acol 컬럼과 c.acol컬럼이 두개다 인덱스가 걸려있어 오래걸리지 않을것으로 예상했는데
생각보다 느려서 확인했더니
case 문을 이용해서 acol이 null일경우 데이터 전체 리스트를 가져오고 not null 일 경우 해당 리스트를 가져올걸 예상했는데
데이터가 null 이 아닌 경우도 엄청 느리더라고요
튜닝 가이드 부탁드립니다 ㅜㅜ
null인경우에는 느린게 이해가 되는데 not null 인경우에도 느려서 문의드려요.
혹시 좋은 방법 아시는분 공유 부탁드리요.
<기존쿼리>
select a.acol, a.bcol, c.ccol
from a_table a, c_table c
where 1=1
and a.acol = c.acol
and a.acol = case
when :b0 is not null then :b0
else a.acol
end;
-> tableacess a테이블
-->nested loop
--->c테이블 fast fullscan
--->a 테이블 Index uniquscan
< null 이 아닌경우 >
null 이 아닌경우 아랫 쿼리같이 풀려 빠를것으로 예상하였지만 느리더라요
select a.acol, a.bcol, c.ccol
from a_table a, c_table c
where 1=1
and a.acol = c.acol
and a.acol = :b0
-> a.acol unique scan으로 빨리 풀림
-- 조건값이 들어오는지? 안들어오는지에 따라 실행계획이 분리되어야 합니다. -- 실행계획에 Conacatenation 이 등장하는지 확인하세요. -- Case 문 대신 Decode 나 NVL 로 바꿔보세요. SELECT a.acol , a.bcol , c.ccol FROM a_table a , c_table c WHERE 1=1 AND a.acol = c.acol AND a.acol = NVL(:b0, a.acol) -- AND a.acol = DECODE(:b0, null, a.acol, :b0) -- AND a.acol = CASE WHEN :b0 IS NOT NULL THEN :b0 ELSE a.acol END ;