database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 21055 게시물 읽기
No. 21055
[질문]rownum에 대하여
작성자
이솔
작성일
2004-12-14 16:34
조회수
3,501

SELECT to_char(view_time,'yyyy/mm/dd hh24:mi:ss'),empno FROM
(SELECT /*+ index_desc(WEB_LOG_00001 WEB_LOG_00001_IDX1) */ view_time,empno,rownum rnum from WEB_LOG_00001
WHERE view_time<=to_date('20041214235959','yyyymmddhh24miss') ORDER BY view_time DESC)
WHERE rnum<=20 and rnum>=10;

 

 

SELECT to_char(view_time,'yyyy/mm/dd hh24:mi:ss'),empno FROM
(SELECT /*+ index_desc(WEB_LOG_00001 WEB_LOG_00001_IDX1) */ view_time,empno,rownum from WEB_LOG_00001
WHERE view_time<=to_date('20041214235959','yyyymmddhh24miss') ORDER BY view_time DESC)
WHERE rownum<=20 and rownum>=10;

 

위에 2개의 sql문은 똑같은데 rownum을 알리아스로 주었는냐 주지 않았는냐 그차이밖에는 없습니다.

그런데 결과는 너무 다릅니다.

알리아스를 준 것은 값을 갖고 오는데 알리아스를 주지 않은 것은 값을 찾지 못하네요. 무엇이 문제인지 알고싶습니다. 될수 있으면 알리아스를 주고 싶지 않거든요. 속도가 너무 늦어서...

 

이 글에 대한 댓글이 총 3건 있습니다.

rownum은 where조건에서 만족하는 row들에 대한 행번호를 달아주는 것입니다.

 alias를 따로 해주시지 않으면 해당 select문 밖에서는 접근이 불가능 합니다.

아래쪽 쿼리문에서는 rownum을 alias하시지 않으셨기때문에 적혀있는 rownum은 서브쿼리의 rownum이 아니라..

주쿼리의 where조건을 만족하는 행들의 rownum이 되는 것입니다.

그래서 서로 다른 결과를 보여주는 것이지요..

 

그리고 alias를 걸어주면...속도가 늦어진다..? 금시초문입니다만..

아마 쿼리속도 느리다고할때.. alias가 원인이되는 것은 1%도 안될 것이라고 생각됩니다.

 

작살초보(작살초보)님이 2004-12-14 16:40에 작성한 댓글입니다.

rownum은 rownum 값이 1인 레코드를 반드시 포함해야 한다고 알고 있습니다.

두번재 sql 같은경우에는 10~20번째의 rownum을 가져오는데 이건 불가능한 내용입니다.

 

1번의 방법이 정상적인 방법이며 2번과 같은 방법으로 가져올수는 없습니다.

 

where 조건이

  where rownum <10

  where rownum >=1 and rownum <10

등등의 경우에만 2번도 가능합니다.

 

참고 :

    그리고 index_desc가 분명히 작동했다면 마지막에 order by는 빼는게 빠를겁니다.

장종훈(장종훈)님이 2004-12-14 16:51에 작성한 댓글입니다.
이 댓글은 2004-12-14 16:55에 마지막으로 수정되었습니다.

오해 하고 있는 부분이 있어서 그런듯합니다.

 

rownum은 오라클에선 예약어입니다.

아래의 sql에서처럼 사용하였을경우 내부의 인라인뷰의 rownum값을 보여줘야한다고 생각하고 계시기 때문이죠.

 

위의 sql에선 alias로 확연하게 인라인뷰의 rownum으로 부여된 값을 사용하겠다고 하는 의도입니다만... 밑의 sql은 최종적으로 나온 값에대한 rownum을 부여하여 그 rownum이 20 과 10 사이의 값을 가져오겠다라는 말이됩니다.

 

그리고 순서적으로 rownum은 조건절로 선택되어 나온 데이타에 대해서 그후에 부여되기 때문에... 몇번째 까지의 데이터를 조건에 넣을수는 있지만 아직 rownum을 부여하지도 않은 시점인 조건절에 몇번째 부터라는 조건은 걸수 없습니다.

 

그리고 속도 문제는 인라인뷰의 다음 마지막 조건에서 위의 sql은 인덱스가 없을테니 건수가 많으면 느릴수도 있겠죠.

 

아레의 sql은 조건에 맞는 데이타가 단한건도 존재할수 없으니 빠를수밖에 없습니다.( 원하는데이타가 아닌데도 빠르다 느리다 말 할 수 없는 부분입니다만 데이타가 없다라는 말은 빨리 뜨겠죠.. ;;)

눈팅님이 2004-12-14 17:12에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
21058쿼리문좀 도와주세요... [2]
고운님
2004-12-14
1247
21057가로로나오는 Data를 세로(row)로 나오게하는 방법 좀 부탁합니다. [2]
임영수
2004-12-14
4967
21056FK의 설정이 시스템의 Performance를 많이 떨어뜨리나요? [6]
안용주
2004-12-14
3192
21055[질문]rownum에 대하여 [3]
이솔
2004-12-14
3501
21054쿼리좀 봐주세요 [2]
왕초보
2004-12-14
991
21053설치된 오라클의 문자종류를 바꾸는 방법이 있나여? [1]
이인수
2004-12-14
1658
21050쿼리좀 도와 주세요. 감사합니다. [11]
unimeek
2004-12-14
3808
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.022초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다