GAGA LIFE.

インフラエンジニアブログ

スポンサーリンク

Hint Report(DBMS_XPLAN)のパラレル処理確認時の注意点

概要

Hint Report(DBMS_XPLAN)を後で確認する際、パラレルクエリの場合、見え方に差異が出る場合があります。
これは、コーディネータのインスタンスとスレーブが実行されたインスタンスでのHint Reportで見え方が異なる場合があるためです。
その動作確認と対応策を記載します。

動作確認

1 号機(SQL 実行ノード=コーディネータ)

  • Hint Report は明示的に指定したヒントが使用される
SQL> show user
ユーザーは"SCOTT"です。
SQL> select instance_name from v$instance;

INSTANCE_NAME
------------------------------------------------
orcl1

SQL> CREATE TABLE t1 (c1 NUMBER, c2 VARCHAR2(10), c3 DATE, CONSTRAINT pk_t1 PRIMARY KEY (c1))
 PARTITION BY HASH (c1)
 (
   PARTITION t1_p1
   , PARTITION t1_p2
   , PARTITION t1_p3
   , PARTITION t1_p4
 );
  2    3    4    5    6    7    8  
表が作成されました。

SQL> BEGIN
  FOR i IN 1..10000 LOOP
    INSERT INTO t1 VALUES(i, LPAD(TO_CHAR(i), 10, '0'), SYSDATE);
  END LOOP;
  COMMIT;
END;
/
  2    3    4    5    6    7  

PL/SQLプロシージャが正常に完了しました。

SQL> ALTER SESSION SET PARALLEL_DEGREE_POLICY = AUTO;

セッションが変更されました。

SQL> select /*+ FULL(t1) PARALLEL(4) */ count(*) from t1;

  COUNT(*)
----------
     10000

SQL> select inst_id, sql_id, sql_text from gv$sql where sql_text like 'select /*+ FULL(t1) PARALLEL(4) */ count(*) from t1';

   INST_ID SQL_ID                                  SQL_TEXT
---------- --------------------------------------- ----------------------------------------------------------------------------------------------------
         1 5n7jvs7k6jbgp                           select /*+ FULL(t1) PARALLEL(4) */ count(*) from t1
         2 5n7jvs7k6jbgp                           select /*+ FULL(t1) PARALLEL(4) */ count(*) from t1

2行が選択されました。

SQL> set lines 1000 pages 2000
SQL> select * from table(DBMS_XPLAN.DISPLAY_CURSOR('5n7jvs7k6jbgp', '0',format=>'ALL ALLSTATS LAST'));

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID  5n7jvs7k6jbgp, child number 0
-------------------------------------
select /*+ FULL(t1) PARALLEL(4) */ count(*) from t1

Plan hash value: 974985148

-------------------------------------------------------------------------------------------------------------------------
| Id  | Operation              | Name     | E-Rows | Cost (%CPU)| E-Time   | Pstart| Pstop |    TQ  |IN-OUT| PQ Distrib |
-------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |          |        |   303 (100)|          |       |       |        |      |            |
|   1 |  SORT AGGREGATE        |          |      1 |            |          |       |       |        |      |            |
|   2 |   PX COORDINATOR       |          |        |            |          |       |       |        |      |            |
|   3 |    PX SEND QC (RANDOM) | :TQ10000 |      1 |            |          |       |       |  Q1,00 | P->S | QC (RAND)  |
|   4 |     SORT AGGREGATE     |          |      1 |            |          |       |       |  Q1,00 | PCWP |            |
|   5 |      PX BLOCK ITERATOR |          |  17370 |   303   (0)| 00:00:01 |     1 |     4 |  Q1,00 | PCWC |            |
|*  6 |       TABLE ACCESS FULL| T1       |  17370 |   303   (0)| 00:00:01 |     1 |     4 |  Q1,00 | PCWP |            |
-------------------------------------------------------------------------------------------------------------------------

Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------

   1 - SEL$1
   6 - SEL$1 / T1@SEL$1

Predicate Information (identified by operation id):
---------------------------------------------------

   6 - access(:Z>=:Z AND :Z<=:Z)

Column Projection Information (identified by operation id):
-----------------------------------------------------------

   1 - (#keys=0) COUNT()[22]
   2 - SYS_OP_MSR()[10]
   3 - (#keys=0) SYS_OP_MSR()[10]
   4 - (#keys=0) SYS_OP_MSR()[10]
   5 - (rowset=1019)
   6 - (rowset=1019)

Hint Report (identified by operation id / Query Block Name / Object Alias):
Total hints for statement: 2
---------------------------------------------------------------------------

   0 -  STATEMENT
           -  PARALLEL(4)

   6 -  SEL$1 / T1@SEL$1
           -  FULL(t1)

Note
-----
   - dynamic statistics used: dynamic sampling (level=2)
   - Degree of Parallelism is 4 because of hint
   - Warning: basic plan statistics not available. These are only collected when:
       * hint 'gather_plan_statistics' is used for the statement or
       * parameter 'statistics_level' is set to 'ALL', at session or system level


57行が選択されました。
  • 指定したヒント(PARALLEL/FULL)がオプティマイザに正常に解釈され、使用されている
  • 「 Degree of Parallelism is 4 because of hint」と出力されている

2 号機(パラレルスレーブ)

  • Hint Report はコーディネータのオプティマイザで指示された内部的なヒントで実行される
SQL> select instance_name from v$instance;

INSTANCE_NAME
------------------------------------------------
orcl2

SQL> select inst_id, sql_id, sql_text from gv$sql where sql_text like 'select /*+ FULL(t1) PARALLEL(4) */ count(*) from t1';

   INST_ID SQL_ID               SQL_TEXT
---------- -------------------- ----------------------------------------------------------------------------------------------------
         1 5n7jvs7k6jbgp        select /*+ FULL(t1) PARALLEL(4) */ count(*) from t1
         2 5n7jvs7k6jbgp        select /*+ FULL(t1) PARALLEL(4) */ count(*) from t1

SQL> select * from table(DBMS_XPLAN.DISPLAY_CURSOR('5n7jvs7k6jbgp', '0',format=>'ALL ALLSTATS LAST'));

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID  5n7jvs7k6jbgp, child number 0
-------------------------------------
select /*+ FULL(t1) PARALLEL(4) */ count(*) from t1

Plan hash value: 974985148

-------------------------------------------------------------------------------------------------------------------------
| Id  | Operation              | Name     | E-Rows | Cost (%CPU)| E-Time   | Pstart| Pstop |    TQ  |IN-OUT| PQ Distrib |
-------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |          |        |   303 (100)|          |       |       |        |      |            |
|   1 |  SORT AGGREGATE        |          |      1 |            |          |       |       |        |      |            |
|   2 |   PX COORDINATOR       |          |        |            |          |       |       |        |      |            |
|   3 |    PX SEND QC (RANDOM) | :TQ10000 |      1 |            |          |       |       |  Q1,00 | P->S | QC (RAND)  |
|   4 |     SORT AGGREGATE     |          |      1 |            |          |       |       |  Q1,00 | PCWP |            |
|   5 |      PX BLOCK ITERATOR |          |  10000 |   303   (0)| 00:00:01 |     1 |     4 |  Q1,00 | PCWC |            |
|*  6 |       TABLE ACCESS FULL| T1       |  10000 |   303   (0)| 00:00:01 |     1 |     4 |  Q1,00 | PCWP |            |
-------------------------------------------------------------------------------------------------------------------------

Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------

   1 - SEL$1
   6 - SEL$1 / T1@SEL$1

Predicate Information (identified by operation id):
---------------------------------------------------

   6 - access(:Z>=:Z AND :Z<=:Z)

Column Projection Information (identified by operation id):
-----------------------------------------------------------

   1 - (#keys=0) COUNT()[22]
   2 - SYS_OP_MSR()[10]
   3 - (#keys=0) SYS_OP_MSR()[10]
   4 - (#keys=0) SYS_OP_MSR()[10]
   5 - (rowset=1019)
   6 - (rowset=1019)

Hint Report (identified by operation id / Query Block Name / Object Alias):
Total hints for statement: 7 (U - Unused (1))
---------------------------------------------------------------------------

   0 -  STATEMENT
           -  PARALLEL(4)
           -  ALL_ROWS
           -  DB_VERSION('19.1.0')
           -  IGNORE_OPTIM_EMBEDDED_HINTS
           -  OPTIMIZER_FEATURES_ENABLE('19.1.0')

   6 -  SEL$1 / T1@SEL$1
         U -  FULL(t1) / rejected by IGNORE_OPTIM_EMBEDDED_HINTS
           -  FULL(@"SEL$1" "T1"@"SEL$1")

Note
-----
   - Warning: basic plan statistics not available. These are only collected when:
       * hint 'gather_plan_statistics' is used for the statement or
       * parameter 'statistics_level' is set to 'ALL', at session or system level
   - parallel query server generated this plan using optimizer hints from coordinator
  • Hint Reportの出力内容が異なっている
  • FULLヒントに「U」がついている
  • 「parallel query server generated this plan using optimizer hints from coordinator」と出力されている

まとめ

上記の通り、パラレル処理でスレーブプロセス側のノードで確認すると正しい情報が採取できない

対応策

実行ノードで確認するのが良いと考えられるが、後で確認する場合は、例えば以下の情報(QC_INSTANCE_ID)から実行ノードの確認が可能

Oracle DatabaseRelease 19c データベース・リファレンス
7.7 V$ACTIVE_SESSION_HISTORY
QC_INSTANCE_ID NUMBER
問合せコーディネータ・インスタンスID。この情報は、サンプリングされたセッションがパラレル問合せスレーブである場合にのみ表示される。
その他のすべてのセッションに対しては、この値は0になる。

SELECT SAMPLE_TIME,SESSION_ID,SESSION_SERIAL#,SQL_ID,SQL_PLAN_HASH_VALUE,QC_INSTANCE_ID,QC_SESSION_ID,QC_SESSION_SERIAL# FROM GV$ACTIVE_SESSION_HISTORY WHERE SQL_ID = '5n7jvs7k6jbgp';

SQL> SELECT SAMPLE_TIME,SESSION_ID,SESSION_SERIAL#,SQL_ID,SQL_PLAN_HASH_VALUE,QC_INSTANCE_ID,QC_SESSION_ID,QC_SESSION_SERIAL# FROM GV$ACTIVE_SESSION_HISTORY
WHERE SQL_ID = '5n7jvs7k6jbgp';
  2  
SAMPLE_TIME              SESSION_ID SESSION_SERIAL# SQL_ID          SQL_PLAN_HASH_VALUE QC_INSTANCE_ID QC_SESSION_ID QC_SESSION_SERIAL#
------------------------ ---------- --------------- --------------- ------------------- -------------- ------------- ------------------
21-04-21 10:27:14.664           155            8432 5n7jvs7k6jbgp             974985148              1           157              50842
21-04-21 10:27:14.664           269           63811 5n7jvs7k6jbgp             974985148              1           157              50842

スポンサーリンク