검색을 아래와 같은 쿼리로 실행할 경우,

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

+ Recent posts