오라클 힌트 이런경우는 적용이안되나요..? 도움좀 부탁드립니다.!!! 0 6 2,172

by matrixkdg [Oracle 기초] [2013.01.03 11:45:27]


오라클 힌트를 보고있습니다..
간단한 테이블에 적용시켜보고자 사용하였으나..

 index(BOARDLIST,SYS_C0011060) -- boardlist 테이블 기본키에따른 인덱스

index(BOARDLIST,BOARDLIST_B_REF) -- boardlist 테이블
아무 키도 걸려있지않은 제가 순수하게 정렬용으로 사용하기위해 만든 인덱스


select /*+index(BOARDLIST,BOARDLIST_B_REF) */ *
from BOARDLIST


order by 사용보단 힌트방식을 사용하는걸 권장하는거같아서 이와같이 만들어보려고했습니다.

실행계획을 보니 인덱스를 전혀 사용하지 않더군요 ..ㅠ

해서 기존에 기본키에 걸려있는 인덱스 부분을 추가해 보았더니..

select /*+index(BOARDLIST,BOARDLIST_B_REF) index(BOARDLIST,SYS_C0011060)*/ * 
from BOARDLIST


index(BOARDLIST,SYS_C0011060) 혹은 index_desc(BOARDLIST,SYS_C0011060)
부분에 관해선 힌트가 적용이 되던데..

혹시 힌트라는것은... 키값이있는 인덱스에만 반응을 하는것인가요..??
아니면 옵티마이저가 그저 받아들이지 않은건가요..?


원래 제가 하려던것은 order by 를 없애고 힌트만으로 정렬쿼리를 새로 만들어 보는것이었습니다만..

자유롭게 힌트만을 사용해서 정렬할수는 없나요..?
by 마농 [2013.01.03 12:52:57]

우선, 인덱스 힌트 사용법이 틀렸습니다만... 이건 문제될건 없구요..
컴마로 구분하는게 아니라 공백으로 구분하는 거에요.. 컴머도 되긴 될겁니다..
인덱스 특징중 하나가 널값이 제외되어 생성된다는 것인데요.
이는 다시 말하면 전체 레코드 수와 인덱스 레코드 수가 다를 수 있다는 거지요.
아무 조건 없이 전체테이블 스캔하는데 인덱스를 경유할 경우 전체 레코드가 나오지 않을 수 있다면?
당연히 인덱스를 사용하지 못하겠지요.
기본키의 경우엔 Not Null 속성을 가지고 있기 때문에 (인덱스 레코드수 = 테이블 레코드수) 공식이 성립됩니다.
따라서 기본키 인덱스를 사용한 거구요.
Not Null 속성이 없는 컬럼에 대한 인덱스는 설령 이 컬럼에 널이 없다손 치더라도...
옵티마이저는 전체 데이터를 까보기 전에는 이를 알 수 없습니다.
해결법은 해당 컬럼에 Not Null 속성을 지정하거나,
조건절에서 IS NOT NULL 조건을 추가하시면 됩니다.


by matrixkdg [2013.01.03 13:52:05]
완전 잘 알겠습니다..

본래 만들려고했던 쿼리가

select /*+index_desc(BOARDLIST,BOARDLIST_B_REF) index(boardlist boardlist_b_re_seq) */ *  
from BOARDLIST
where b_ref is not null and b_re_seq is not null

요런 형태일진데... 두개 동시 힌트가 먹질않아서 애를먹고있네요...

방법을 찾아서 노력중입니다 ㅎㅎ

by 마농 [2013.01.03 13:57:53]
그건 불가능합니다.
두개 컬럼으로 된 결합인덱스를 말들어 사용하셔야 합니다.
또한 결합인덱스의 컬럼이 하나는 ASC 다른 하나는 DESC 로 하려면
인덱스 자체를 생성할때부터 그렇게 만들어야 합니다.
Desc 인덱스는 함수기반 인덱스처럼 동작하구요, 이는 굳이 추천하고 싶지 않은 방법이네요.

by matrixkdg [2013.01.03 16:04:46]
 아아 그렇군요!!!! 감사합니다 

역시 아무리해도 안되더군요 ...

그리고..인덱스 생성시에 기본정렬 asc를 desc 방식으로도 만들수도있나요?

또한 이와같이 한테이블에 2번이상의 정렬을 할경우 그냥 order by 를 사용하는 방법밖에 없나요??

너무나 많은 정보 알려주셔서 감사드립니다.!!

by 마농 [2013.01.03 16:12:44]

인덱스는 다음과 같이 만드시면 됩니다.
CREATE INDEX x01 ON boardlist(b_ref DESC, b_re_seq);
다만, 인덱스가 유용하게 사용될 경우는 전체 자료중 일부분만 발췌할때 뿐입니다.
전체 자료 조회시엔 테이블 풀스캔이 차라리 낫습니다.
무분별하게 인덱스를 생성하는 것은 바람직하지 않습니다.


by matrixkdg [2013.01.03 17:40:58]
아 이렇게 생성하는거군요!

음.. 그렇구나.. 인덱스 기초부분을 아무래도 조금더 봐야할거같습니다

많은 도움 주셔서 정말 감사드립니다 ^^
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입