컴퓨터활용/오라클

INDEX_DESC HINT

멜번초이 2009. 11. 7. 10:30


게시판 프로그램을 작성할 때 최신 게시물이 먼저 나오도록 하는 경우에 index_desc 를 많이 사용하게 된다. 


 

사용방법



SELECT /*+ INDEX_DESC(TABLE_ALIAS_NAME INDEX_NAME) */ *
FROM TABLE_NAME TABLE_ALIAS_NAME
WHERE KEY1 = :B1

(index_name index가 key1 column에 생성되어 있다)

윗 문장에 rownum=1 조건을 추가하면 key가 제일 큰 것 하나만 조회되므로, max function의 기능을 대신할 수 있다.  최신글 조회하고자 한다면 다음과 같이 한다.

  SELECT  * FROM (
      SELECT /*+ INDEX_DESC(B TB_CO_ARTICLE_PK) */
          ROWNUM AS RN, B.*
      FROM TB_CO_ARTICLE B, TB_BO_EMYE E
        WHERE  B.BOARD_ID = :boardId
        AND    B.PRPTMAN_ID = E.EMPNO(+)
        AND    ROWNUM <= :toNo
  ) WHERE   RN > :startNo


주의사항 :   
/*+ 다음에 스페이스를 반드시 줘야 함. 
테이블 알리아스를 사용해야 한다. 테이블의 물리명을 사용하면 안됨.

 SINGLE TABLE QUERY에서는 HINT 절에 table 명을 주는 것이 원칙이다.

* Hint 내의 table_name은 alias를 사용하였을 경우에는 반드시 table alias name으로 지정하여야 한다.

* 그 이유는 다음과 같이 SQL이 사용될 경우도 있기 때문니다.
 
(SELF-JOIN)

select /*+ index_desc(a a_pk) */
*
from t1 a, t1 b
where a.key1 = 'a'
and a.key1 = b.prev_c1(+)
and a.seq = b.pseq_no(+)
and rownum = 1

위와 같이 동일한 TABLE이 FROM 절 뒤에 복수로 나오는 경우 (Recursive 관계)가 있을 수 있는데 이 때 Hint 절의 table 명을
유일하게 줄 수가 없으므로 반드시 table alias name을 주어야  원하는 답이 나온다.



<원본참조 : https://kr.forums.oracle.com/forums/thread.jspa?threadID=454210>