그동안 inline view에서 order by desc 로 정렬한 후에 rownum <= 5 로 구하곤 했었는데
최근 rank() 함수의 사용법을 알게되었습니다.
성능상 Rank()함수를 이용하는게 나을까요? 아니면 rownum 을 이용하는게 나을까요?
아니면 같을까요..
그냥 문득 궁금해졌습니다..
by 마농
[2009.01.29 08:44:49]
Top-N 쿼리에서는 rank는 중복일수도 있으니 중복이 없는 row_number을 이용해야겠지요.
오라클 버전에 따라 차이가 있긴 하지만 rank가 지원되는 버전이라면 아마도 rownum이 유리할듯 합니다.
row_number의 경우엔 전체 자료에 대해 순위를 매겨야 하므로 모든자료를 정렬을 위한 임시공간에 상주시킵니다.
그러나 rownum을 사용하면 마찬가지로 전체자료를 모두 읽기는 하지만 정렬을 위한 공간이 5개만 필요합니다.
즉 자료 비교후 5위안에 들지 않는것은 아예 저장하지 않고 배제하고 5위 안에 드는것만 저장하게 됩니다.
by 마농
[2009.01.29 08:48:25]
인덱스힌트를 이용한 방법도 있습니다.
이 경우엔 정렬 자체가 불필요하므로 성능이 더 좋습니다.
by 요루
[2009.01.29 09:16:39]
아하~ 그렇군요.. 감사합니다.
인덱스 힌트라 하심은 혹시 index_desc 를 말씀하시는건가요?
by 마농
[2009.01.29 09:43:03]
테이블 a의 등록일자 항목에 인덱스가 있고 인덱스명이 idx_ymd 라고 한다면
SELECT /*+ INDEX_DESC(a idx_ymd) */ *
FROM a
WHERE ROWNUM <= 5
이렇게 하면 전체자료 다 읽을 필요 없이 5건의 자료만 인덱스 스캔을 이용해 읽어내게 됩니다.
by 호야
[2009.01.29 09:56:31]
단 GROUP BY 이나 ORDER BY 사용시 전체 스캔을 허용하기 때문에
순수 자료를 읽는 것에 목적이 있어야 합니다