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 을 먼저 부여한 후 조건을 설정해준다.

{code:sql}

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