게시글 최근 5개 글뽑기 쿼리를 짜다가 너무 궁금해서 여쭈어 봅니다.
보통 저는
SELECT ROWNUM, A.*
FROM (
select * from test order by date desc
)A
WHERE ROWNUM <= 5;
이런씩으로 쿼리를 짰었는데요
SELECT ROWNUM,a.*
FROM test a
WHERE ROWNUM <=5 ORDER BY date DESC;
이런 씩으로 짜닌깐 똑같은 결과가 나오더라구요.. 머리에 혼란이 옵니다.
ORDER BY 가 지금 WHERE 절보다 먼저 실행이 됐다는 건데 도저히 이해를 할 수 가 없습니다.
이게 맞는 문법 인지요? 쉬원한 답변좀 부탁드릴께요 ㅜ 답답합니다..
Order By 가 Where 절보다 먼저 수행된것이 아닙니다.
Order By 가 수행되지 않은 것입니다.
실행계획을 확인해 보세요.
정렬키에 해당하는 인덱스가 존재하면
정렬 대신 인덱스를 이용해 자료를 추출합니다.
인덱스는 정렬이 된 상태이므로 별도 정렬은 필요 없죠.
맞는 문법이냐구요? 엄밀히 말하면 틀린거죠...
2번 방식은 인덱스 존재 여부에 따라 결과가 달라질 수 있으니 말이죠.
1번 방식은 인덱스 존재여부에 상관 없이 정확한 결과를 도출합니다.
- 인덱스가 없으면 정렬을 수행하고
- 인덱스가 있으면 인덱스 스캔을 통해 정렬을 하지 않습니다.