index range scan을 unique scan으로 풀리도록 할 수 있나요? 0 4 3,163

by 준 [Oracle Tuning] index range scan unique scan hint 힌트 [2016.04.01 13:17:54]


select col_b

 from table_a

where col_a = 'A'

   and col_b in ('111','222')

;

 

table_a의 PK는 col_a + col_b 입니다.

 

위 쿼리의 플랜을 떠보면 index range scan으로 풀리는데,

이걸 index unique scan으로 풀리도록 유도할 수 있을까요?

 

테이블의 레코드수는 3억건 가량이고,

col_a는 'A'값만 들어가있습니다. 실질적인 키는 col_b인 셈이죠.

 

in 절의 비교 갯수를 1000개로 늘렸더니 속도가 안나와서 질문 드립니다.

 

by 신이만든짝퉁 [2016.04.01 17:31:15]

unique scan은 1건을 리턴하는 인덱스이므로, in 절을 사용하여 여러 값을 검색조건으로 사용하면 range scan이 나오는 것은 당연합니다.

제 생각에는 인덱스 컬럼 순서를 colb + cola 로 바꾸는 것이 좋을 것 같습니다.


by 준 [2016.04.01 17:46:40]

답변 감사드립니다.

인덱스 순서는 바꾸기 어려운 상태이고요..

with tt as
(
          select '111' col from dual
union all select '222' col from dual
}
select col_b
  from table_a  a
     , tt  b
 where a.col_a = 'A'
   and a.col_b = b.col

이렇게 쿼리를 바꾸면 unique scan으로 바뀌어 속도가 나오긴 한데, 조건값을 1000개로 늘리자니

sql이 너무 길어지네요. 적절한 hint를 사용해 scan 방식을 바꿀 수 있지 않을까 생각했는데, 구조적으로 불가능하다는 말씀이신 것 같네요..


by 마농 [2016.04.04 08:59:21]

by 준 [2016.04.18 17:39:50]

감사합니다. 큰 도움 되었습니다.

상황을 꿰뚫어보고 적절한 답을 주시다니.. 역시 마농님입니다. ^^

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