2016년 12월 1일 목요일

[오라클교육,SQL교육,튜닝교육학원추천_탑크리에듀][COUNT,SQL튜닝]구체화뷰를 이용한 count(*) 함수 튜닝, oracle mview를 이용한 count튜닝

[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

댓글 없음:

댓글 쓰기