Oracle에서 ORDER BY 없이 인덱스만으로 자동 정렬이 될까?
결론부터 말하겠습니다.
“안 됩니다. 반드시 ORDER BY를 써야 합니다.”
인덱스가 정렬된 구조라 하더라도, Oracle은 쿼리 결과의 순서를 자동으로 보장하지 않습니다.
1. 왜 안 되는가?
- SQL에서 ORDER BY가 없으면 결과 순서는 미정(indeterminate) 입니다.
- 인덱스는 내부적으로 정렬된 구조(B-tree)를 유지하지만, 데이터를 읽어오는 순서는 옵티마이저가 결정합니다.
- 옵티마이저는 인덱스를 항상 순차적으로 읽는 보장이 없고, 다른 실행 계획(Full Table Scan 등)으로 바꿀 수 있습니다.
2. “근데 인덱스를 타면 정렬돼서 나오던데요?”
맞습니다. 다음과 같은 조건에서는 우연히 정렬처럼 보일 수 있습니다.
- Index Range Scan이나 Index Full Scan을 사용
- 쿼리에서 필요한 컬럼이 모두 인덱스에 포함됨 (Covering Index)
- 실행 계획이 변하지 않고, 통계 정보나 데이터 양이 비슷한 경우
하지만 이건 어디까지나 지금 환경에서만 우연히 정렬된 것입니다.