아래는 Database Reference의 V$MYSTAT 뷰에 대한 내용입니다. 참고로 병렬 쿼리는 현재 세션이 QC 역할을 담당하고, 별도의 세션의 PX 서버가 작업을 수행합니다. 병렬 쿼리의 성능 분석에 V$MYSTAT 뷰를 활용하려면 PX 서버의 통계 값이 V$MYSTAT 뷰의 통계 값에 포함되어야 합니다. 결론부터 말하면 V$MYSTAT 뷰와 V$SESSTAT 뷰의 통계 값은 PX 서버의 통계 값을 포함합니다. 참고로 V$SESSION_EVENT 뷰의 대기 이벤트 정보는 PX 서버의 대기 이벤트 정보를 포함하지 않습니다.
V$MYSTAT contains statistics on the current session.
테스트를 위해 아래와 같이 테이블을 생성하겠습니다.
-- 1 DROP TABLE t1 PURGE; CREATE TABLE t1 (c1) AS SELECT ROWNUM FROM XMLTABLE ('1 to 1000000');
아래와 같이 쿼리를 수행하여 consistent gets의 델타 값을 계산하겠습니다. 직렬로 수행한 2-2번 쿼리는 1,527개, 병렬로 수행한 2-3번 쿼리는 1,572개의 블록을 읽습니다. 참고로 V$MYSTAT 뷰 대신 V$SESSTAT 뷰를 사용해도 동일한 결과를 얻을 수 있습니다.
-- 2-1 SELECT b.value FROM v$statname a, v$mystat b WHERE a.name = 'consistent gets' AND b.statistic# = a.statistic#; -- SELECT b.value FROM v$statname a, v$sesstat b WHERE a.name = 'consistent gets' AND b.statistic# = a.statistic# AND b.sid = USERENV ('SID'); VALUE ----- 45 1개의 행이 선택되었습니다. -- 2-2 SELECT /* TEST1 */ /*+ GATHER_PLAN_STATISTICS */ COUNT (*) AS c1 FROM t1; 1개의 행이 선택되었습니다. SELECT b.value FROM v$statname a, v$mystat b WHERE a.name = 'consistent gets' AND b.statistic# = a.statistic#; -- SELECT b.value FROM v$statname a, v$sesstat b WHERE a.name = 'consistent gets' AND b.statistic# = a.statistic# AND b.sid = USERENV ('SID'); VALUE ----- 1572 -- 1527 = 1572 - 45 1개의 행이 선택되었습니다. -- 2-3 SELECT /* TEST2 */ /*+ GATHER_PLAN_STATISTICS PARALLEL(2) */ COUNT (*) AS c1 FROM t1; 1개의 행이 선택되었습니다. SELECT b.value FROM v$statname a, v$mystat b WHERE a.name = 'consistent gets' AND b.statistic# = a.statistic#; -- SELECT b.value FROM v$statname a, v$sesstat b WHERE a.name = 'consistent gets' AND b.statistic# = a.statistic# AND b.sid = USERENV ('SID'); VALUE ----- 3126 -- 1554 = 3126 - 1572 1개의 행이 선택되었습니다.
앞서 수행한 쿼리의 런타임 실행 계획을 살펴보면 2-2, 2-3번 쿼리의 Buffers 값이 consistent gets 값과 같은 것을 확인할 수 있습니다. 참고로 3-3번 실행 계획의 1, 2번 오퍼레이션은 QC, 4~6번 오퍼레이션은 PX 서버에 의해 수행됩니다.
-- 3-1 SELECT sql_id, sql_text, executions FROM v$sql WHERE sql_text LIKE 'SELECT /* TEST%'; SQL_ID SQL_TEXT EXECUTIONS ------------- ------------------------------------------------------------------------------------ ---------- 7vbgr6sbd548a SELECT /* TEST1 */ /*+ GATHER_PLAN_STATISTICS */ COUNT (*) AS c1 FROM t1 1 9bnqthrvhymu4 SELECT /* TEST2 */ /*+ GATHER_PLAN_STATISTICS PARALLEL(2) */ COUNT (*) AS c1 FROM t1 1 2 행이 선택되었습니다. -- 3-2 SELECT plan_table_output FROM TABLE (DBMS_XPLAN.DISPLAY_CURSOR ('7vbgr6sbd548a', NULL, 'ALLSTATS')); --------------------------------------------- | Id | Operation | Name | Buffers | --------------------------------------------- | 0 | SELECT STATEMENT | | 1527 | -- 1527 | 1 | SORT AGGREGATE | | 1527 | | 2 | TABLE ACCESS FULL| T1 | 1527 | --------------------------------------------- -- 3-3 SELECT plan_table_output FROM TABLE (DBMS_XPLAN.DISPLAY_CURSOR ('9bnqthrvhymu4', NULL, 'ALLSTATS')); ----------------------------------------------------- | Id | Operation | Name | Buffers | ----------------------------------------------------- | 0 | SELECT STATEMENT | | 5 | -- 1554 = 1549 + 5 | 1 | SORT AGGREGATE | | 5 | | 2 | PX COORDINATOR | | 5 | | 3 | PX SEND QC (RANDOM) | :TQ10000 | 0 | | 4 | SORT AGGREGATE | | 1549 | | 5 | PX BLOCK ITERATOR | | 1549 | |* 6 | TABLE ACCESS FULL| T1 | 1549 | -----------------------------------------------------