[SQL groupby 튜닝]오라클 구체화뷰(Oracle MATERIALIZED VIEW, MVIEW)를 이용한 GROUP함수 튜닝,
부서의 급여 최소값을 갖는 직원 추출
-- 실습테이블 생성
create table myemp1
(empno number not null primary key,
ename varchar2(100),
deptno number,
addr varchar2(100),
sal number
)
- 테이블에 대략 2000만건 데이터 입력 후
-- 인덱스 생성
create index idx_myemp1_deptno_sal on myemp1(sal, deptno)
-- 통계정보 생성
analyze table myemp1 compute statistics
-- 부서의 최소급여 받는 사원 추출, 약 40초
SELECT /*+ index(A idx_myemp1_sal_dept) */
ENAME, SAL, ADDR
FROM myemp1 A
WHERE sal = (SELECT MIN(SAL)
FROM myemp1 B
WHERE B.DEPTNO = A.DEPTNO);
-- 구체화뷰(mview) 생성
CREATE MATERIALIZED VIEW m7
BUILD IMMEDIATE
REFRESH
COMPLETE
ON DEMAND
ENABLE QUERY REWRITE
AS
select
deptno, min(sal) avgsal from myemp1
group by deptno
-- 바로 나옴
SELECT /*+ index(A idx_myemp1_sal_dept) */
ENAME, SAL, ADDR
FROM myemp1 A, m7
WHERE A.SAL = m7.avgsal
and A.deptno = m7.deptno
create table myemp1
(empno number not null primary key,
ename varchar2(100),
deptno number,
addr varchar2(100),
sal number
)
- 테이블에 대략 2000만건 데이터 입력 후
-- 인덱스 생성
create index idx_myemp1_deptno_sal on myemp1(sal, deptno)
-- 통계정보 생성
analyze table myemp1 compute statistics
-- 부서의 최소급여 받는 사원 추출, 약 40초
SELECT /*+ index(A idx_myemp1_sal_dept) */
ENAME, SAL, ADDR
FROM myemp1 A
WHERE sal = (SELECT MIN(SAL)
FROM myemp1 B
WHERE B.DEPTNO = A.DEPTNO);
-- 구체화뷰(mview) 생성
CREATE MATERIALIZED VIEW m7
BUILD IMMEDIATE
REFRESH
COMPLETE
ON DEMAND
ENABLE QUERY REWRITE
AS
select
deptno, min(sal) avgsal from myemp1
group by deptno
-- 바로 나옴
SELECT /*+ index(A idx_myemp1_sal_dept) */
ENAME, SAL, ADDR
FROM myemp1 A, m7
WHERE A.SAL = m7.avgsal
and A.deptno = m7.deptno
댓글 없음:
댓글 쓰기