[COUNT,SQL튜닝]구체화뷰를 이용한 count(*) 함수 튜닝, oracle mview를 이용한 count튜닝
myemp1 테이블은 현재 데이터가 2000만건쯤 있고 empno 컬럼은 primary key이다.
실습데이터는 다음 URL을 참조하여 만드세요
http://www.ojc.asia/bbs/board.php?bo_table=LecHINT&wr_id=117
오라클11g의 경우 아래와 같은 SQL문 실행시 index fast full scan을 하도록 되어 있다.
약 8초쯤 걸렸다.(힌트를 안써도 인덱스 패스트 풀 스캔한다.)
SQL> select /*+ index_ffs(e SYS_C0011122) */ count(empno) from myemp1 e
SQL> select count(empno) from myemp1 e
이번에는 mview를 이용하여 count(*) 튜닝을 해보자. 물론 원본데이터가 변경 되더라도 즉시 mview에 반영이 되어 count가 증가되어야 한다.
1. drop MATERIALIZED VIEW LOG ON myemp1;(이미 있다면)
CREATE MATERIALIZED VIEW LOG ON myemp1 WITH PRIMARY KEY, ROWID
INCLUDING NEW VALUES;
2. CREATE MATERIALIZED VIEW m_count
BUILD IMMEDIATE -- MView 생성과 동시에 데이터들도 생성
REFRESH FAST -- 원본의변경된 데이터만 mview에 갱신
ON COMMIT -- Commit 이 일어날 때 뷰 Refresh
ENABLE QUERY REWRITE
AS
select count(*) cnt from myemp1
count를 해보자 0초 걸린다. mview가 사용됨을 실행계획을 통해 알 수 있다.
SQL> select count(*) from myemp1;
COUNT(*)
----------
20000000
경 과: 00:00:00.00
Execution Plan
----------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Ti
me |
--------------------------------------------------------------------------------
--------
| 0 | SELECT STATEMENT | | 1 | 13 | 3 (0)| 00
:00:01 |
| 1 | MAT_VIEW REWRITE ACCESS FULL| M_COUNT | 1 | 13 | 3 (0)| 00
:00:01 |
이번에는 myemp table에 데이터를 한건 입력하고 mview에 실시간으로 반영되는지 확인하자.
SQL> insert into myemp1 (empno, ename) values (22222222, '222길동');
1 개의 행이 만들어졌습니다.
SQL> commit;
커밋이 완료되었습니다.
SQL> select count(*) from myemp1;
COUNT(*)
----------
20000001
댓글 없음:
댓글 쓰기