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 40431 게시물 읽기
No. 40431
오라클 쿼리에 몇가지 의문이 있어 질문 드립니다. 확인 좀 부탁드려요^^;;
작성자
김종수(enmu)
작성일
2014-04-16 13:05
조회수
7,244

제가 작성한 쿼리는 아니고 다른분께서 작성하신 쿼리인데 그 분께 문의드릴수 없어 이곳에 여쭤보는 것이니 양해 부탁드립니다.

select
   originalQuery.*
    , rownum as rn
from (
   select
      abc
   from originalTable
   order by abc desc nulls last
) originalQuery
where  rownum <= : 2
 

위의 쿼리에서 문의드릴 사항은 아래의 3가지 항목입니다.

1.  rownum <= : 2 가 어떤 의미를 가지는지?

2. select oQ.*, rownum (select abc from oT order by abc ) oQ 와 select abc, rownum from oT order by abc 의 차이

3. order by abc 가 ( ) 안에 있는 쿼리에 들어가 있는 추측할 수 있는 이유

다른 DB와 다른 오라클만의 어떠한 특성이 있을듯 하여 문의드리니 답변 부탁드립니다.

감사합니다.

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

1.  rownum <= : 2 가 어떤 의미를 가지는지?
   - 콜론(:)이 앞에 붙어 있는 것은 변수입니다. 변수에 입력값이 대입될 것이구요.
   - ROWNUM 은 조회 결과의 ROW 번호입니다.
   - ROWNUM <= 10 은 10건만 출력하고 끝내겠다는 의미죠.
2. select oQ.*, rownum (select abc from oT order by abc ) oQ 와
   select abc, rownum from oT order by abc 의 차이
   - ROWNUM 은 조회 결과의 ROW 번호입니다.
   - 이 때 ROWNUM 은 ORDER BY 보다 우선합니다.
   - 정렬 후 ROWNUM 과 정렬전 ROWNUM 은 같지 않습니다.
3. order by abc 가 ( ) 안에 있는 쿼리에 들어가 있는 추측할 수 있는 이유
   다른 DB와 다른 오라클만의 어떠한 특성이 있을듯 하여 문의드리니 답변 부탁드립니다.
   - 오라클에서 정렬된 결과 중 일부만 가져올 때 사용하는 방법입니다.
   - 정렬후 rownum 하지 않고
     rownum 과 order by 를 함께 사용하면 잘못된 결과를 맞이하게 됩니다.
   - 다른 DB 에서는 ROWNUM 이 없습니다.
     TOP n 이나 LIMIT 등의 방식을 사용하며, 정렬구문을 감쌀 필요가 없습니다.
4. Top N 동작 원리
   - Top N 쿼리는 정렬결과의일부만 가져오는 방식을 말하구요
   - 동작원리는 전체 정렬 후 일부를 반환하는 것입니다.
   - 하지만 전체 정렬에 대한 부담을 줄이는 것이 바로 일부만 취하는 방법입니다.
   - 정렬을 위해서는 별도의 정렬을 위한 공간이 필요하게 되는데
   - ROWNUM 을 이용하면 정렬을 위한 공간을 최소화 합니다.
   - 예를 들어 100만건을 정렬하여 10건을 가져오는 경우에
     100만건을 모두 읽어야 하는것은 어쩔 수 없는 현실입니다.
     100만건을 정렬하기 위해서는 100만개의 정렬공간이 필요합니다.
     그러나 ROWNUM <= 10 과 함께 사용하면 정렬공간은 10개만 있으면 됩니다.
5. 정렬을 피하는 방법
   - 100만건을 정렬하려면 정렬공간을 10개만 쓰더라도 일량은 많죠
   - 정렬키로 된 인덱스가 있다면? 위 똑같은 Top N 쿼리를 사용했을 때
     정렬 없이 인덱스 10건만 읽고 끝납니다. 100만건을 모두 읽지 않는거죠.
   - 단 위와 같이 Nulls last 구문과 함께 사용하면 효과 없습니다.

마농(manon94)님이 2014-04-16 14:28에 작성한 댓글입니다.
이 댓글은 2014-04-16 14:34에 마지막으로 수정되었습니다.

답변 감사합니다 ^^

덕분에 궁금한 부분이 해결되었습니다.

김종수(enmu)님이 2014-04-17 17:11에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
40434role과 privs 기초 질문!
임서희
2014-04-17
7024
404332개의 서버에 1개의 db일경우 select update 질문
김주환
2014-04-17
6227
40432[ORA-01438]초보자입니다. 도와주세요. [2]
이용훈
2014-04-16
6318
40431오라클 쿼리에 몇가지 의문이 있어 질문 드립니다. 확인 좀 부탁드려요^^;; [2]
김종수
2014-04-16
7244
40429[질문] 순차적으로 가로로 데이터를 추출한는 query 문의 드립니다. [13]
안동석
2014-04-14
8217
40428난이도 있는? 쿼리 질문입니다. [3]
착한넘
2014-04-10
8303
40427ORACLE 연결 Time out 문제 [1]
허양민
2014-04-10
6709
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다