-----------------------------------------------------------------------------------------------------------
-- ORACLE 12C 페이지 나누기 쿼리
-- 기존방식 vs Row Limiting Clause를 이용하는 방법
-----------------------------------------------------------------------------------------------------------
-- myemp1 테이블(1000만건)에서 ename 칼럼을 기준으로 오름차순 인덱스가 생성되어 있다.
-- create index IDX_MYEMP1_ENAME on myemp1(ename_;
-- 한페이지당 10개 출력.
-- ename를 기준으로 내림차순으로 Dislplay.
-- 10,000번째 페이지를 출력하는 쿼리를 작성하시오.
-----------------------------------------------------------------------------------------------------------
-- 0초
-- 안쪽 SELECT에서 ROWNUM으로 한계치를 미리 지정하여 건수를 줄임
SELECT *
FROM (
SELECT a.*, ROWNUM rnum
FROM (
SELECT empno, ename, sal
FROM myemp1 e
ORDER BY ename DESC
) a
WHERE ROWNUM <= 10000*10
)
WHERE rnum >= 9999 * 10 +1;
-- 0초
-- 안쪽 SELECT에서 ROWNUM으로 한계치를 미리 지정하여 건수를 줄임
-- ORDER BY를 사용안하니 직접 ROWNUM으로 비교 가능하므로 SELECT 절이 하나 빠짐
SELECT empno, ename, sal
FROM
(
SELECT /*+ index_desc(e IDX_MYEMP1_ENAME) */
ROWNUM rnum,
empno,
ename,
sal
FROM myemp1 e
WHERE ROWNUM <= 10000*10
)
WHERE rnum >= 9999*10+1;
-- ORACLE 12C(12.1이상) Row Row Limiting Clause이용
-- 인덱스 스캔이 안되는 경우 4초이상
-- 9999페이지까지는 SKIP하고 그 다음 10000번째 페이지의 10개 추출
SELECT
empno,
ename,
sal
FROM myemp1 e
ORDER BY ename DESC
OFFSET 9999*10 ROWS FETCH NEXT 10 ROWS ONLY;
-- ORACLE 12C(12.1이상) Row Row Limiting Clause이용
-- 인덱스 스캔이 되는 경우 0초
-- 9999페이지까지는 SKIP하고 그 다음 10000번째 페이지의 10개 추출
SELECT /*+ index_desc(e IDX_MYEMP1_ENAME) */
empno,
ename,
sal
FROM myemp1 e
WHERE ename > '가'
ORDER BY ename DESC
OFFSET 9999*10 ROWS FETCH NEXT 10 ROWS ONLY;
-- 만약 MySQL이라면 디음과 같이하면 된다.
SELECT *
FROM myemp1
ORDER BY ename
LIMIT 9999*10,10; -- 9999번째 페이지까지 스킵하고 10개를 추출
댓글 없음:
댓글 쓰기