SQL 튜닝의 시작 (2013년)
ROWNUM 이해와 관련 SQL 성능 문제 이해하기 0 0 99,999+

by 구루비스터디 ROWNUM [2018.07.14]


ROWNUM 이해와 관련 SQL 성능 문제 이해하기

ROWNUM 데이터를 먼저 추출한 이후 조회하자


C1 C2 C3
----- -- ---------
1 C 101
2 D 102
3 E 103
4 F 104
5 G 105
6 H 106
7 I 107
8 J 108
9 K 109
10 L 110


-- SQL[1]

SELECT *
FROM  (SELECT *
       FROM   t1
       ORDER BY c1)
WHERE  ROWNUM >= 1
AND    ROWNUM <= 5;

C1 C2 C3
----- -- ---------
1 C 101
2 D 102
3 E 103
4 F 104
5 G 105

-- SQL[2]

SELECT *
FROM  (SELECT *
       FROM   t1
       ORDER BY c1)
WHERE  ROWNUM >= 6
AND    ROWNUM <= 10;

-- 데이터 추출 안됨.



SQL[2]에서 데이터가 추출되지 않는 이유는?
  • 조건에 해당하는 데이터를 추출하면서 나오는 데이터에 차례대로 ROWNUM 순번을 부여함.
C1ROWNUMROWNUM 조건결과 데이터
11ROWNUM >= 1 AND ROWNUM <= 5 만족하므로 결과 데이터로 포함.1
1ROWNUM >= 6 AND ROWNUM <= 10 만족하지 않으므로 패스.
22ROWNUM >= 1 AND ROWNUM <= 5 만족하므로 결과 데이터로 포함.1, 2
1ROWNUM >= 6 AND ROWNUM <= 10 만족하지 않으므로 패스.
33ROWNUM >= 1 AND ROWNUM <= 5 만족하므로 결과 데이터로 포함.1, 2, 3
1ROWNUM >= 6 AND ROWNUM <= 10 만족하지 않으므로 패스.
44ROWNUM >= 1 AND ROWNUM <= 5 만족하므로 결과 데이터로 포함.1, 2, 3, 4
1ROWNUM >= 6 AND ROWNUM <= 10 만족하지 않으므로 패스.
55ROWNUM >= 1 AND ROWNUM <= 5 만족하므로 결과 데이터로 포함.1, 2, 3, 4, 5
1ROWNUM >= 6 AND ROWNUM <= 10 만족하지 않으므로 패스.
66ROWNUM >= 1 AND ROWNUM <= 5 만족하지 않으므로 패스. 스톱
1ROWNUM >= 6 AND ROWNUM <= 10 만족하지 않으므로 패스.


  • 결국 SQL[2] 쿼리에서는 ROWNUM 조건을 만족하는 데이터가 없으므로 계속 ROWNUM 1 을 부여하다 끝이 남.


SQL[2] 쿼리의 원래 의도대로 결과값을 추출해 내려면?
  • ROWNUM 조건을 주지 말고 조회된 데이터에 ROWNUM 을 먼저 부여한 후 조건을 설정해준다.


SELECT c1, c2, c3, RNUM
FROM  (SELECT ROWNUM rnum,
              t1.*
       FROM  (SELECT *
              FROM   t1
              ORDER BY c1) T1
       )
WHERE  rnum >= 6 and rnum <= 10 ;


"데이터베이스 스터디모임" 에서 2013년에 "SQL튜닝의시작 " 도서를 스터디하면서 정리한 내용 입니다.

- 강좌 URL : http://www.gurubee.net/lecture/3824

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입