author 테이블에 bank_reg 'Y' 인값이 10% 정도 밖에 않된다고 하셨는데
그러면, 'N' 라는 값을 null 값으로 처리하고 인덱스를 그냥두세요
null 값은 인덱스생성 부분에 포함이 되지 않습니다.
( 단, 'N' 라는 값을 자주 찾지않는다면 )
oracle trace 를 해보셔야지만 되겠지만 ...
첫번째 쿼리는 author bank_reg = 'Y' 인것과 뒤에 나오는 조건을 같이 비교하는것이고
두번째 쿼리는 bank_reg = 'Y' 인것을 먼저 필터링한 갯수 만큼을 비교한다는 것이죠
설명이 너무 부족 했던것 같습니다.
설연휴 잘 보내십시요...
>>이기태 님께서 쓰시길<<
::
:: SELECT name FROM author WHERE bank_reg = 'Y' AND ASCII(name) >= 45217 AND ASCII(name) < 45994 OR
:: DER BY name
::
:: SELECT name FROM ( SELECT name FROM author WHERE bank_reg = 'Y' )
:: WHERE ASCII(name) >= 45217 AND ASCII(name) < 45994 ORDER BY name
::
:: (bank_reg는 bitmap index가 걸려 있습니다. Y or N 이죠 이 경우
:: bitmap index를 거는게 올바른 가요?, 전체 3만권중 'Y'의 비중은 10%미만 입니다.)
::
:: 첫번째 쿼리는 50~60ms가 걸리고
::
:: 두번째는 30ms 정도가 걸립니다.
::
:: inline view를 만들어서 주는 쿼리가 약 2배 가까이 빠르다는 소린데.
::
:: 위의 쿼리문을 그럼 아래와 같은 형식으로 오라클 옵티마이저가 분석하지 않고
::
:: 다르게 한다는 소린데 어떻게 하는지요?
::
:: 그리고 쿼리를 날리때 inline view를 쓰면 대부분의 경우에 이득을 볼수 있다는
:: 소리 같은데..
::
:: 지도 부탁 드립니다.
::
::
::
|