Top-N 개를 구할때 Rank()함수가 유리할까요? rownum이 유리할까요? 0 6 5,402

by 요루 rank [2009.01.29 08:23:34]



제목 그대로 입니다.

상위 5개의 항목을 구하고 싶을때

그동안 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 사용시 전체 스캔을 허용하기 때문에
순수 자료를 읽는 것에 목적이 있어야 합니다

by 호야 [2009.01.29 09:58:49]
http://www.oracle.com/technology/oramag/oracle/07-jan/o17asktom.html

깊은 자료는 아니지만, 기본적은 Top-N 쿼리 자료입니다.
ROW_NUMBER, RANK,DESEN_RANK 등을 보여 주네요
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입