본문 바로가기
DataBase

ORDER BY 대신에 INDEX 힌트를 사용하자..

by eqzero 2006. 12. 7.
기존의 내가 사용하던 게시판 리스트를 가져오는 쿼리는

SELECT * FROM (
      SELECT ROWNUM rnum, num, id, name FROM MEMBERS
      WHERE ROWNUM <= 10
)  WHERE rnum > 0

위와 같은 쿼리를 날리면 오라클 기본 정렬을 기준으로 10건까지의 데이터를 가져오게 된다.
문제는 차후에 ORDER BY 가 필요한 경우다.
 --    ORDER BY ID DESC, NAME ASC
위와 같은  정렬이 필요한경우 ROWNUM을 사용하면 ORDER BY는 무의미해지므로 다른 방법을 모색해야 했다.
(ROWNUM으로 10건을 가져온후 ORDER BY 하게된다..-_-;).
여러 방법이 있겠지만 내가 선택한 방법은 인덱스를 설정하는것이다

CREATE INDEX IDX_MEMBERS ON MEMBERS(ID DESC, NAME ASC)

위와 같이 만들어주자.
그럼 이제 저 인덱스를 쿼리문에서 힌트에 태워줘보자..-_-;;

SELECT * FROM (
      SELECT   /*+ INDEX_ASC(MEMBER IDX_MEMBERS) */
                     ROWNUM rnum, num, id, name FROM MEMBERS
      WHERE (ID > 'TEST' OR ID < 'TEST')
      AND ROWNUM = 10
)  WHERE rnum > 0
WHERE 조건에 ID를 준것은 INDEX를 태우기 위함이다. ID를 주지 않거나 NAME를 주면 타지않는다..
달랑 힌트만 준다고 인덱스를 타진 않는다.
이러면 힌트를 타 정렬된것중에서 10건을 가져오게된다...오묘한 인덱스의 세계~...공부가 쵝오..-_-b