인덱스와 rownum을 같이 사용하면 안되나요? 0 3 2,569

by 양양 [SQL Query] [2023.01.16 23:15:15]


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 조합의 결과가 완전하지 않다는 말은 신뢰할 수 있을지 궁금합니다.

by jkson [2023.01.17 09:28:35]

말씀하신대로 정렬 보장하지 않는다고 알고 있습니다.

만약 테스트한 결과가 정렬된 상태로 나왔다고 하더라도 어떤 상황에 어떻게 정렬이 깨질지 알 수 없는 것이고

프로그램이라는 것이 잘 되다가도 한번 오류나면 크게 사고가 나는 경우도 있기 때문에

되도록 정렬 안 될 가능성을 생각하고 프로그래밍하시는 게 좋을 것 같습니다.

인덱스 힌트를 주었으나 인덱스 자체도 언제든 INVALID 상태로 빠질 수 있다는 것도 고려하셔야할 것이구요.


by 우리집아찌 [2023.01.17 09:48:16]

정렬이 보장되지도 않고

나중에 index 변경하게 되면 문제 발생할수 있습니다.

 


by 마농 [2023.01.17 10:40:44]

굳이 힌트 안주더라도
정렬구문을 이용해 정렬 후 ROWNUM 하면 알아서 인덱스도 타고 정렬도 보장됩니다.
ROW_NUMBER 를 이용해도 알아서 인덱스 잘 탑니다.
굳이 힌트 를 이용하고자 한다면 다음 힌트도 함께 사용하세요.
/*+ no_batch_table_acces_by_rowid */

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입