rownum 질문입니다.. 0 6 2,878

by 손님 rownum [2009.03.17 10:28:36]


 

 

 

 

 

 select num,substr(title,1,18) TIT from board where rownum <= 5 order by num desc

 

 이렇게 해서 rownum 으로 5개의 값을 가져오거든요,,

 그런데 이 5개의 값이 제가 원하는 값이 아니고,  무조건 가장 오래된(인서트된지) 값이더라구요,

 제가 원하는 건 가장최근 5건을 불러오려고 하는데,, 이리저리 해봐도 잘 안되더라구요,,

 

num   title

8  안녕하세요1

7 안녕하세요2

6 안녕하세요3

5 안녕하세요4

4 안녕하세요5

3 안녕하세요6

2 안녕하세요7

1 안녕하세요8

 

 이렇게 데이타가 있으면,  전 안녕하세요 1~5 까지 가져오려고 하는데,

 4~8까지밖에 못 가져와서요,,,,

 

 

 조언 좀 부탁드립니다  ^^;

 

 

 

by 피터 [2009.03.17 13:03:46]
rownum 쓰실려면 order by를 하시고 밖에서 다시 감싸셔야 합니다.
order by가 마지막에 실행되기 때문에 위처럼 사용하시면 원하는 데이터를 보장받지 못하십니다.
select *
from (
select num,substr(title,1,18) TIT from board order by num desc
)
where rownum <= 5

by 채용근 [2009.03.17 13:22:50]
num이 pk라면 힌트를 걸어주시면 됩니다.

SELECT /*+ INDEX_DESC ( TABLE_ALIS PK_INDEX ) */ ..... FROM board where rownum <= 5

by 작성자 [2009.03.17 14:57:18]
답변 감사합니다 ^^;

by feelie [2009.03.17 16:07:21]
내용을 보니 자주 질문되는 내용이고 그리고 궁금한 점이 있어 질문드립니다.
rownum, order by 사용시 주의점은 rownum이 먼저 수행되고 order by가 나중에수행되므로 order by을 수행하는 view을 만들고 나서 조건에 rownum의 갯수로 조건을 주어야 한다.
라고 많이 되어있습니다.

그럼 실제로는 order by절이 수행되는 부분은 전체범위처리이고 이전체범위처리가 끝나고 나서 원하는 로우만 취할수 있다는 얘기인데요.
view 을 원하는 부분만 읽고처리하는 방법이 채용근님께서 하신 index_desc 방법외에는 전체범위처리를 피할수 있는 방법이 없는건가요????

by 마농 [2009.03.17 16:41:46]
테이블 전체스캔은 피할수 없습니다. 전체 자료에 대한 정렬 및 순번을 메겨야 하니까요.
다만 피터님께서 제시하신 방법이 생각하신것처럼 비효율적으로 돌아가지는 않습니다.
자료정렬을 위해서는 템프 공간이 필요합니다.
일반적으로는 데이터 건수만큼의 공간이 필요하겠지요.
하지만 rownum조건과 함께 정렬을 하게 되면 템프공간은 rownum조건만큼만 필요로 합니다.

by 마농 [2009.03.18 08:39:58]
또한 오라클도 버전이 올라감에 따라 위와 같은 쿼리를 작성했다 하더라도 정렬항목이 인덱스항목이라면 옵티마이져가 알아서 인덱스 역스캔을 통한 데이터 추출을 하게 됩니다.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입