2014년 3월 6일 목요일

[COUNT,SQL튜닝]구체화뷰를 이용한 count(*) 함수 튜닝, oracle mview를 이용한 count튜닝 myemp1 테이블은 현재 데이터가 2000만건쯤 있고 empno 컬럼은 primary key이다. 실습데이터는 다음 URL을 참조하여 만드세요 http://www.oraclejavanew.kr/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 [출처] 오라클자바커뮤니티 - http://www.oraclejavanew.kr/bbs/board.php?bo_table=LecOrccleTun&wr_id=70 오라클자바커뮤니티에서 운영, 개발자 전문교육, 개인80%환급 오엔제이프로그래밍실무교육센터(www.onjprogramming.co.kr) 평일주간(9:30~18:30) 개강 (3/10)[기업100%환급]Spring ,MyBatis,Hibernate실무과정 (3/10)[기업100%환급]SQL기초에서 Schema Object까지 (3/10)C#4.0,ADO.NET,Network 프로그래밍 (3/11)[채용예정자]오라클자바개발잘하는신입뽑기2개월 (3/17)[기업100%환급]자바기초에서 JDBC, Servlet/JSP까지 (3/24)[기업100%환급][기업100%환급]PL/SQL,ORACLE HINT,TUNING 평일야간(19:00~22:00) 개강 (3/04)C#,ASP.NET마스터 (3/07)안드로이드개발자과정 (3/10)SQL초보에서실전전문가까지 (3/11)웹퍼블리싱 마스터 (3/11)iPhone 하이브리드 앱 개발 실무과정 (3/13)Spring3.X, MyBatis, Hibernate실무과정 (3/14)자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지 주말(10:00~18:00) 개강 (3/08)안드로이드개발자과정 (3/08)JAVA&WEB프레임워크실무과정 (3/09)C#,ASP.NET마스터 (3/15)웹퍼블리싱 마스터 (3/15)Spring3.X, MyBatis, Hibernate실무과정 (3/15)닷넷실무자를위한WPF개발자과정 (3/22)자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지 (3/29)SQL초보에서실전전문가까지 주말저녁(18:30~22:20) 개강 (3/08)자바기초에서JSP,Servlet,Ajax,jQUERY,스프링,마이바티스,하이버네이트 (3/15)SQL기초에서 Schema Object까지

[COUNT,SQL튜닝]구체화뷰를 이용한 count(*) 함수 튜닝, oracle mview를 이용한 count튜닝

myemp1 테이블은 현재 데이터가 2000만건쯤 있고 empno 컬럼은 primary key이다.
실습데이터는 다음 URL을 참조하여 만드세요

http://www.oraclejavanew.kr/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 
오라클자바커뮤니티에서 운영, 개발자 전문교육, 개인80%환급 오엔제이프로그래밍실무교육센터(www.onjprogramming.co.kr)

평일주간(9:30~18:30) 개강
(3/10)[기업100%환급]Spring ,MyBatis,Hibernate실무과정
(3/10)[기업100%환급]SQL기초에서 Schema Object까지
(3/10)C#4.0,ADO.NET,Network 프로그래밍
(3/11)[채용예정자]오라클자바개발잘하는신입뽑기2개월
(3/17)[기업100%환급]자바기초에서 JDBC, Servlet/JSP까지
(3/24)[기업100%환급][기업100%환급]PL/SQL,ORACLE HINT,TUNING
평일야간(19:00~22:00) 개강
(3/04)C#,ASP.NET마스터
(3/07)안드로이드개발자과정
(3/10)SQL초보에서실전전문가까지
(3/11)웹퍼블리싱 마스터
(3/11)iPhone 하이브리드 앱 개발 실무과정
(3/13)Spring3.X, MyBatis, Hibernate실무과정
(3/14)자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지

주말(10:00~18:00) 개강
(3/08)안드로이드개발자과정
(3/08)JAVA&WEB프레임워크실무과정
(3/09)C#,ASP.NET마스터
(3/15)웹퍼블리싱 마스터
(3/15)Spring3.X, MyBatis, Hibernate실무과정
(3/15)닷넷실무자를위한WPF개발자과정
(3/22)자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지
(3/29)SQL초보에서실전전문가까지

주말저녁(18:30~22:20) 개강
(3/08)자바기초에서JSP,Servlet,Ajax,jQUERY,스프링,마이바티스,하이버네이트
(3/15)SQL기초에서 Schema Object까지


댓글 없음:

댓글 쓰기