게시판 프로그램을 작성할 때 최신 게시물이 먼저 나오도록 하는 경우에 index_desc 를 많이 사용하게 된다.
사용방법
SELECT /*+ INDEX_DESC(TABLE_ALIAS_NAME INDEX_NAME) */ *FROM TABLE_NAME TABLE_ALIAS_NAMEWHERE 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을 주어야 원하는 답이 나온다.