검색을 아래와 같은 쿼리로 실행할 경우,
SELECT *
FROM
(
SELECT rownum rn, bbsno, writer, content, title
FROM TBL_BBS
WHERE rownum <=20
ORDER BY bbsno DESC
)
WHERE rn > 10
낮은 코스트가 나온다
하지만 이 쿼리의 문제점은 데이터 양이 적을 때 풀 스캔을 먹는다는것이다.
- 힌트를 이용하여 강제로 풀스캔을 먹인 경우
SELECT /*+FULL(tbl_bbs)*/ rownum rn, bbsno, writer, content, title
FROM TBL_BBS
WHERE rownum <= 20
ORDER BY bbsno DESC
전체 디비를 검색하고 로우넘을 붙이고 마지막에 소팅을 한다. 코스트가 엄청 커진다.
검색 결과를 보면 처음부터 검색하는지 않고 중간에서 부터 결과가 나온다.
- 인덱스의 단점은 : 인덱스를 이용하여 insert나 delete 작업을 하면 떨어진다.
- 인덱스를 타고 싶은데 오라클 옵티마이저가 스스로 판단해서 full scan을 할때도 있기 때문에 로우넘이 꼬이는 경우가 있다. 그래서 hint를 사용하여 무조건 인덱스를 타게 해준다.
※ order by를 사용하지 않는다! 인덱스를 이용하여 아래에서 부터 검색
SELECT
/*+INDEX_DESC(tbl_bbs pk_bbs)*/ //->order by를 사용하지 않고 DESC를 사용해서
rownum rn, bbsno, writer, content, title
FROM TBL_BBS
WHERE bbsno > 0
AND rownum <= 20
SELECT
/*+INDEX(tbl_bbs pk_bbs)*/
rownum rn, bbsno, writer, content, title
FROM TBL_BBS
WHERE bbsno > 0
AND rownum <= 20