같은 실행 계획에 다른 처리 속도 가능한가요?? 0 1 178

by level42 [2020.06.26 11:03:24]


안녕하세요.

최근 쿼리 성능이 바인드 변수에 따라 차이가 나는 걸 발견하고 여러가지 확인을 해보다 풀리지 않는 것이 있어 

글을 쓰게 됐습니다. 

 

SQL성능이 바인드 변수의 값에 따라 차이가 많이 나서 실행계획을 확인해봤더니, 

실행계획은 동일했습니다. 그런데 속도차이가 약 100배 정도 차이가 나더라고요.

실제 쿼리는 아래보다 훨씬 복잡하지만, 입력되는 바인드 변수에 따라 변경되는 부분은 아래와 같습니다. 

 

select a.* 

from test a

where a.col1 = decode(:bind1, '2', decode(:bind2, 'A', a.col1, rtrim(:bind3)),a.col1)

     and a.col2 = a.col2;

이런 식의 쿼리고,

where 조건절인 a.col1 = decode(:bind1, '2', decode(:bind2, 'A', a.col1, rtrim(:bind3)),a.col1)가

유입되는 바인드 변수에 따라 a.col1=a.col1 이 되는 경우는 처리속도가 100msec이하인데,

a.col1=rtrim(:bind3) 인경우에는 처리속도가 7~8초를 훌쩍 넘기게 됩니다.

a.col1의 경우 인덱스컬럼은 아닙니다.

 

이 두가지경우의 실행플랜을 보니 실행플랜은 동일한데 처리속도가 너무 달라져서 왜 그런건지 궁금합니다.

또, 이렇게 달라지는 쿼리 속도를 빠르게 튜닝하려면 어떻게 해야할까요..?

고견 부탁드립니다!

by 마농 [2020.06.26 12:29:50]

쿼리 결과(건수)도 다를 듯 하네요.
a.col1 = a.col1 조건을 타게 되면 모든 자료가 나올 것이고
a.col1 = rtrim(:bind3) 조건을 타게 되면 일부 자료만 나오겠네요.
전체자료 조회시 일부분만 우선 조회되어 빠르게 느껴지는 것일 수 있습니다.(페이징처리)
일부자료 조회시 빠르게 하려면 인덱스가 필요합니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입