LIKE를 사용하는 쿼리성능개선 문의. 1 5 1,220

by jason kim [Oracle Tuning] LIKE함수 쿼리튜닝 [2021.02.04 13:41:01]


T라는 테이블안에 C1이라는 컬럼이 있음

C1이라는 컬럼의 값음 업무+sequence = 총 10자리로 설계

예) A2라는 업무

A1라는 업무 : A100003001(C1값)

A2라는 업무 : A200000100(C1값)

A3라는 업무 : A300002100(C1값)

B1라는 업무 : B100202100(C1값)

업무가 총 30~40개 정도 되고 있음 (업무별 시퀀스라고 보시면 됩니다.)

 

현재 문제가 되고 있는 쿼리는 아래처럼 돌고 있음니다.

SELECT MAX(C1)

FROM T

WHERE C1 LIKE :1 || '%'

:1 바인드 값으로 - A1, A2, A3, B1등 업무가 들어옴.

 

업무별 MAX sequence를 찾아 max +1 정도 하는것으로 사용 C1이라는 컬럼이 PK로 잡혀 있어서 range scan으로 풀리고 있습니다. ( 평균 Elapsed time 0.5초정도 걸림. )

해당 쿼리를 개선할 방법이 있을까요? 고수님들 어떻게 하는게 좋을까요?

 

테이블 설계를 바꿔서 업무랑 시퀀스를 분리하는게 맞지만,

 

공통으로 사용하는 부분이라 프로그램을 하나하나 찾아가면서 반영하기도 어렵고 테이블이 변경된 시점에 동시에 반영해야되서 

쿼리 튜닝으로 성능을 개선하고자 하는데 생각만큼 성능이 나오지 않음.

(업무 key값이 무조건 2자리면 substr(c1,1,2)로 짤라서 function based index를 사용하려고 했지만 업무 key값이 2,3자리 두종류로 있더라고요)

by 마농 [2021.02.04 14:02:58]

이상하네요?
LIKE 로 인한 범위검색이 된다고 하더라도
단순 MAX 를 사용한다면? 실행게획이 MIN/MAX 로 동작해 빠를텐데요?
실제 사용 쿼리와 질문에 제시된 쿼리가 다를 것 같은 의심이 드네요.


by 마농 [2021.02.04 14:37:07]

혹시나 싶어 테스트를 좀 해봤습니다.
테스트를 해 보니 Like 로 조건 주면 MIN/MAX 를 안타네요. (충격...)
다음과 같이 범위 검색으로 바꿔 보니 MIN/MAX 를 잘타네요.
- 변경전 : WHERE c1 LIKE :1 || '%'
- 변경후 : WHERE c1 > :1 AND c1 < :1 || 'Z'


by jason kim [2021.02.04 15:53:35]

확인 감사합니다.

'Z'  요런 형태로 사용하면 되겠네요.


by 샤랄라 [2021.02.04 16:24:36]
SELECT :1 || LPAD(REPLACE(C1, :1) + 1, LENGTH(REPLACE(C1, :1)), 0) AS C1
FROM (SELECT C1
      FROM T
      WHERE C1 LIKE :1 || '%'
      ORDER BY C1 DESC
     )
WHERE ROWNUM <= 1
;

 


by jason kim [2021.02.04 17:51:20]

확인 감사합니다. ^^

 

요것도 괜찮은 방법인거 같아요

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