아래는 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 |
-----------------------------------------------------