오라클TopN쿼리, 상위N명구하기, 오라클12 행제한구,인라인뷰, WITH구문, ROWNUM이용(오라클학원/ORACLE학원교육)
http://ojc.asia/bbs/board.php?bo_table=LecSQLnPlSql&wr_id=703
ojc.asia

https://www.youtube.com/watch?v=BVeBkyIWUrU&list=PLxU-iZCqT52Dlz0zGgFiq1mBz21arFUHS&index=33

ORACLE SQL
급여 상위 N명 구하기
실습 : ORACLE 19C
실습데이터 : http://ojc.asia/bbs/board.php?bo_table=LecHINT&wr_id=117&page=7
실습 ; 사원테이블에서 급여 상위3명을 추출 하세요.
실습테이블 소개
-- 2000만건
SELECT * FROM MYEMP1;
-- 급여 컬럼에 생성된 인덱스 확인
SELECT A.INDEX_NAME, A.COLUMN_NAME, B.VISIBILITY
FROM USER_IND_COLUMNS A, USER_INDEXES B
WHERE A.TABLE_NAME = 'MYEMP1'
AND A.INDEX_NAME = B.INDEX_NAME
AND A.COLUMN_NAME = 'SAL';
IDX_MYEMP1_SAL SAL VISIBLE
1. 인라인뷰 & ROWNUM 이용
-- 아래처럼 하지 마세요! -- ORDER BY는 맨 나중에 실행됩니다. SELECT ENAME, SAL FROM MYEMP1 WHERE ROWNUM < 8 ORDER BY SAL DESC; -- 2.5초 SAL 컬럼 인덱스를 이용못하고 MYEMP1 테이블 FULL SCAN함 SELECT * FROM ( SELECT ENAME, SAL FROM MYEMP1 ORDER BY SAL DESC ) T1 WHERE ROWNUM < 8; -- 0초, WHERE절에 SAL 컬럼이 출현함에 따라 SAL 컬럼 인덱스를 이용함 SELECT * FROM ( SELECT ENAME, SAL FROM MYEMP1 WHERE SAL > 0 ORDER BY SAL DESC ) T1 WHERE ROWNUM < 8; -- 0초, 힌트이용, ORDER BY 생략 -- SAL 컬럼 인덱스가 오름차순으로 생성되어 있어서 역순으로 스캔 SELECT * FROM ( SELECT /*+ INDEX_DESC(MYEMP1 IDX_MYEMP1_SAL) */ ENAME, SAL FROM MYEMP1 WHERE SAL > 0 ) T1 WHERE ROWNUM < 8; |
2.ORACLE 12C 행제한구 이용
-- 2.5초 SAL 컬럼 인덱스를 이용못하고 MYEMP1 테이블 FULL SCAN함 -- 중복되는 급여가 있더라도 무조건 6개 자름 SELECT ENAME, SAL FROM MYEMP1 ORDER BY SAL DESC FETCH FIRST 7 ROWS ONLY; -- 0초, SAL 컬럼 인덱스를 이용함 -- 중복되는 급여가 있더라도 무조건 6개 자름 SELECT ENAME, SAL FROM MYEMP1 WHERE SAL > 0 ORDER BY SAL DESC FETCH FIRST 7 ROWS ONLY; -- 0초, 오라클 힌트 이용, SAL 컬럼 인덱스를 이용함 -- ORDER BY절 생략(힌트구문 때문에 인덱스 영역에서 역순으로 이미 가져오니 생략됨) SELECT /*+ INDEX_DESC(MYEMP1 IDX_MYEMP1_SAL) */ ENAME, SAL FROM MYEMP1 WHERE SAL > 0 FETCH FIRST 7 ROWS ONLY; -- 0초, SAL 컬럼 인덱스를 이용함 -- 중복되는 급여가 있으면 모두 SELECT함 SELECT ENAME, SAL FROM MYEMP1 WHERE SAL > 0 ORDER BY SAL DESC FETCH FIRST 4 ROWS WITH TIES; |
3.WITH구문과 ROWNUM 이용
-- 2.5초 SAL 컬럼 인덱스를 이용못하고 MYEMP1 테이블 FULL SCAN함 WITH A AS ( SELECT ENAME, SAL FROM MYEMP1 ORDER BY SAL DESC) SELECT ENAME, SAL FROM A WHERE rownum <= 3; -- 0초, WHERE절에 SAL 컬럼이 출현함에 따라 SAL 컬럼 인덱스를 이용함 WITH A AS ( SELECT ENAME, SAL FROM MYEMP1 WHERE SAL > 0 ORDER BY SAL DESC) SELECT ENAME, SAL FROM A WHERE rownum <= 3; -- 0초, 힌트이용, ORDER BY 생략 -- SAL 컬럼 인덱스가 오름차순으로 생성되어 있어서 역순으로 스캔 WITH A AS ( SELECT /*+ INDEX_DESC(MYEMP1 IDX_MYEMP1_SAL) */ ENAME, SAL FROM MYEMP1 WHERE SAL > 0 ) SELECT ENAME, SAL FROM A WHERE rownum <= 3; |
#TopN쿼리, #상위N명쿼리, #오라클교육, #WITH구문, #인라인뷰, #행제한구문, #오라클강의, #오라클학원, #ORACLE교육, #ORACLE동영상, #SQL교육, #SQL학원, TopN쿼리, 상위N명쿼리, 오라클교육, WITH구문, 인라인뷰, 행제한구문, 오라클강의, 오라클학원, ORACLE교육, ORACLE동영상, SQL교육, SQL학원,