CREATE TABLE EXAMPLE(COL1 NUMBER, COL2 NUMBER);
CREATE INDEX EXAMPLE_IDX ON EXAMPLE(COL1);
SELECT /*+ USE_INDEX(EXAMPLE) */ *
FROM EXAMPLE
WHERE COL1 > 0
AND ROWNUM <= 1000;
SELECT STATEMENT TABLE ACCESS BY INDEX ROWID BATCHED TABLE "EXAMPLE" INDEX RANGE SCAN "EXAMPLE_IDX" |
12c 이후 "TABLE ACCESS BY INDEX ROWID BATCHED TABLE" 의 등장으로
인덱스와 rownum 조합의 결과가 완전하지 않다는 글을 보았는데
DBMS_RANDOM 함수를 사용하여 10만건 정도를 테스트해보니,
"TABLE ACCESS BY INDEX ROWID BATCHED TABLE"
가 발생하여도 정렬을 지키면서 결과가 출력되는 것을 확인하였습니다.
(10만건 정도면 테스트 하기에는 충분한 결과 같은데...부족해서 일까요)
12c 이후 인덱스와 rownum 조합의 결과가 완전하지 않다는 말은 신뢰할 수 있을지 궁금합니다.
말씀하신대로 정렬 보장하지 않는다고 알고 있습니다.
만약 테스트한 결과가 정렬된 상태로 나왔다고 하더라도 어떤 상황에 어떻게 정렬이 깨질지 알 수 없는 것이고
프로그램이라는 것이 잘 되다가도 한번 오류나면 크게 사고가 나는 경우도 있기 때문에
되도록 정렬 안 될 가능성을 생각하고 프로그래밍하시는 게 좋을 것 같습니다.
인덱스 힌트를 주었으나 인덱스 자체도 언제든 INVALID 상태로 빠질 수 있다는 것도 고려하셔야할 것이구요.
정렬이 보장되지도 않고
나중에 index 변경하게 되면 문제 발생할수 있습니다.
굳이 힌트 안주더라도
정렬구문을 이용해 정렬 후 ROWNUM 하면 알아서 인덱스도 타고 정렬도 보장됩니다.
ROW_NUMBER 를 이용해도 알아서 인덱스 잘 탑니다.
굳이 힌트 를 이용하고자 한다면 다음 힌트도 함께 사용하세요.
/*+ no_batch_table_acces_by_rowid */