OceanBase logo

OceanBase

トランザクション処理、分析、AIワークロードに最適な分散データベース

プロダクト概要
デプロイを自由に

OceanBase Cloud

OceanBaseの導入とスケーリングを最適化

エンタープライズ版

自社インフラ上での運用・管理に対応

オープンソース版を試す

コミュニティ版

開発者向けオープンソース分散データベース

OceanBase seekdb

AIネイティブなオープンソースの検索データベース

顧客事例

さまざまな業界の企業による導入事例を紹介します。

さらに見る
利用シーン別

あらゆるシナリオに対応するOLTP

ハイブリッドクラウドソリューション

大容量ストレージデータベースのコスト削減

リアルタイム分析混合ワークロード

複数インスタンスの統合

ドキュメント

会社概要

OceanBaseの企業情報、パートナーシップ、そして信頼性・セキュリティへの取り組みについて紹介します。

OceanBaseについて

トラストセンター

法的情報

お問い合わせ

日本 - 日本語
International - English
中国站 - 简体中文
クラウドで始める

OceanBase

トランザクション処理、分析、AIワークロードに最適な分散データベース

プロダクト概要
デプロイを自由に

OceanBase Cloud

OceanBaseの導入とスケーリングを最適化

エンタープライズ版

自社インフラ上での運用・管理に対応

オープンソース版を試す

コミュニティ版

開発者向けオープンソース分散データベース

OceanBase seekdb

AIネイティブなオープンソースの検索データベース

顧客事例

さまざまな業界の企業による導入事例を紹介します。

さらに見る
利用シーン別

あらゆるシナリオに対応するOLTP

ハイブリッドクラウドソリューション

大容量ストレージデータベースのコスト削減

リアルタイム分析混合ワークロード

複数インスタンスの統合

OceanBaseの企業情報、パートナーシップ、そして信頼性・セキュリティへの取り組みについて紹介します。

OceanBaseについて

トラストセンター

法的情報

お問い合わせ

クラウドで始める
编组
すべての製品
    • データベース
    • アイコンOceanBaseデータベース
    • アイコンOceanBase Cloud
アイコン

OceanBaseデータベース

SQL - V4.4.2

    OceanBase ロゴ

    AI時代を支える分散データベース

    日本 - 日本語
    International - English
    中国站 - 简体中文
    プロダクト
    OceanBase Cloudエンタープライズ版コミュニティ版OceanBase seekdb
    会社概要
    OceanBaseについてトラストセンター法的情報お問い合わせ
    公式アカウント
    ConnpassXQiitaLumaGitHub

    © OceanBase 2026. All rights reserved

    クラウドサービス契約個人情報保護ポリシーセキュリティ
    お問い合わせ
    ドキュメントフィードバック
    1. ホーム
    2. OceanBaseデータベース
    3. SQL
    4. V4.4.2
    アイコンOceanBaseデータベース
    SQL - V 4.4.2
    データベース
    • OceanBaseデータベース
    • OceanBase Cloud
    SQL
    KV
    • V 4.4.2
    • V 4.3.5

    診断の実践:DBMS_XPLANシステムパッケージを使用したパフォーマンス診断

    最終更新日:2026-06-15 02:31:30  更新
    シェア
    このページの内容
    システムパッケージについて
    display_cursor
    display_active_session_plan
    enable_opt_trace
    典型的なシナリオの診断
    クエリは実行終了できるが、実行速度が非常に遅い
    クエリの実行が非常に遅く、長時間終わらない
    プランの生成時間が非常に長い、またはプラン生成中にメモリ不足で予期しないプランが生成された場合
    情報の解釈
    plan tableのフィールド紹介
    optimizer infoの紹介
    プランのパフォーマンスが悪い原因を迅速に特定する
    opt_traceログの解読
    関連ドキュメント

    折りたたみ

    シェア

    DBMS_XPLANシステムパッケージは、論理計画の最適化追跡など、論理計画管理に関連する機能を提供します。

    システムパッケージについて

    display_cursor

    機能紹介

    OceanBaseデータベースは、ユーザーが実行したすべてのクエリの計画(物理計画および論理計画を含む)を保存し、ユーザーが後から問題の調査に利用できるようにします。ユーザーが履歴のクエリ計画を読みやすくするために、OceanBaseデータベースは関連するDBMSパッケージを提供しています。EXPLAIN で生成される論理実行計画とは異なり、ユーザーが実際に実行したクエリ計画はデータベースに常に保存され、ユーザーが接続を切断しても即座に無効になることはありません。デフォルトでは、これらの実行計画は以下の条件を満たした場合にクリーンアップされます:

    • メモリ圧力による淘汰:実行計画が多数保存されている場合、システムは古い計画の淘汰をトリガーします。
    • 手動クリーンアップ:ユーザーは ALTER SYSTEM FLUSH PLAN CACHE コマンドを使用して、キャッシュを手動でクリアできます。
    • クラスタ再起動:計画キャッシュはクラスタ再起動時に完全にリセットされます。

    関連パッケージ関数説明

    -- display sql plan table`s plan
    function display_cursor(plan_id      integer default 0,             -- default value: last plan
                            format		 varchar2 default 'TYPICAL',
                            svr_ip       varchar2 default null,         -- default value: server connected by client
                            svr_port     integer default 0,             -- default value: server connected by client
                            tenant_id	 integer default 0              -- default value: current tenant
                            )
    return dbms_xplan_type_table;
    

    パラメータ説明:

    • plan_id:計画ID。指定しない場合、最後に実行された計画を意味します。
    • format:計画の形式。上記と同じです。
    • svr_ip、svr_port:計画が存在するノードのIPアドレス。デフォルトはセッションが接続しているノードのIPアドレスです。
    • tenant_id:計画が属するテナントID。デフォルトはセッションが現在接続しているテナントです。

    関連データディクショナリの説明

    実行計画情報が格納されているデータディクショナリは__all_virtual_sql_planであり、各テナントには対応するシステムビューとしてgv$ob_sql_plan(現在のテナントのすべてのマシンの計画)とv$ob_sql_plan(現在のテナントの現在のマシンの計画)が存在します。

    +--------------------+---------------------+------+-----+---------+-------+
    | Field              | Type                | Null | Key | Default | Extra |
    +--------------------+---------------------+------+-----+---------+-------+
    | tenant_id          | bigint(20)          | NO   | PRI | NULL    |       |
    | plan_id            | bigint(20)          | NO   | PRI | NULL    |       |
    | svr_ip             | varchar(46)         | NO   | PRI | NULL    |       |
    | svr_port           | bigint(20)          | NO   | PRI | NULL    |       |
    | sql_id             | varchar(32)         | NO   |     | NULL    |       |
    | db_id              | bigint(20)          | NO   |     | NULL    |       |
    | plan_hash          | bigint(20) unsigned | NO   |     | NULL    |       |
    | gmt_create         | timestamp(6)        | NO   |     | NULL    |       |
    | operator           | varchar(255)        | NO   |     | NULL    |       |
    | options            | varchar(255)        | NO   |     | NULL    |       |
    | object_node        | varchar(40)         | NO   |     | NULL    |       |
    | object_id          | bigint(20)          | NO   |     | NULL    |       |
    | object_owner       | varchar(128)        | NO   |     | NULL    |       |
    | object_name        | varchar(128)        | NO   |     | NULL    |       |
    | object_alias       | varchar(261)        | NO   |     | NULL    |       |
    | object_type        | varchar(20)         | NO   |     | NULL    |       |
    | optimizer          | varchar(4000)       | NO   |     | NULL    |       |
    | id                 | bigint(20)          | NO   |     | NULL    |       |
    | parent_id          | bigint(20)          | NO   |     | NULL    |       |
    | depth              | bigint(20)          | NO   |     | NULL    |       |
    | position           | bigint(20)          | NO   |     | NULL    |       |
    | search_columns     | bigint(20)          | NO   |     | NULL    |       |
    | is_last_child      | bigint(20)          | NO   |     | NULL    |       |
    | cost               | bigint(20)          | NO   |     | NULL    |       |
    | real_cost          | bigint(20)          | NO   |     | NULL    |       |
    | cardinality        | bigint(20)          | NO   |     | NULL    |       |
    | real_cardinality   | bigint(20)          | NO   |     | NULL    |       |
    | bytes              | bigint(20)          | NO   |     | NULL    |       |
    | rowset             | bigint(20)          | NO   |     | NULL    |       |
    | other_tag          | varchar(4000)       | NO   |     | NULL    |       |
    | partition_start    | varchar(4000)       | NO   |     | NULL    |       |
    | partition_stop     | varchar(4000)       | NO   |     | NULL    |       |
    | partition_id       | bigint(20)          | NO   |     | NULL    |       |
    | other              | varchar(4000)       | NO   |     | NULL    |       |
    | distribution       | varchar(64)         | NO   |     | NULL    |       |
    | cpu_cost           | bigint(20)          | NO   |     | NULL    |       |
    | io_cost            | bigint(20)          | NO   |     | NULL    |       |
    | temp_space         | bigint(20)          | NO   |     | NULL    |       |
    | access_predicates  | varchar(4000)       | NO   |     | NULL    |       |
    | filter_predicates  | varchar(4000)       | NO   |     | NULL    |       |
    | startup_predicates | varchar(4000)       | NO   |     | NULL    |       |
    | projection         | varchar(4000)       | NO   |     | NULL    |       |
    | special_predicates | varchar(4000)       | NO   |     | NULL    |       |
    | time               | bigint(20)          | NO   |     | NULL    |       |
    | qblock_name        | varchar(128)        | NO   |     | NULL    |       |
    | remarks            | varchar(4000)       | NO   |     | NULL    |       |
    | other_xml          | varchar(4000)       | NO   |     | NULL    |       |
    +--------------------+---------------------+------+-----+---------+-------+
    

    display_active_session_plan

    機能紹介

    典型的なユースケース:ユーザーが大規模なSQLを実行している際に、現在の接続が長時間実行されており、クエリの実行状況(実行計画や実行プロセスなど)を確認したい場合です。このような状況では、現在のセッションが大規模なSQLに占有されているため、新しい接続を開き、show full processlistコマンドでその大規模なSQLが存在するセッションを特定し、session_idとdisplay_active_session_planを使用して大規模なSQLの実行詳細を表示する必要があります。

    関連パッケージ関数の説明

    -- disable real time plan
    function display_active_session_plan(
               session_id   integer default 0,
               format       varchar2  default  'TYPICAL',
               svr_ip       varchar2 default null,      -- default value: server connected by client
               svr_port     integer default 0           -- default value: server connected by client
               )
    return dbms_xplan_type_table;
    
    • session_id:ユーザー接続のセッションID。proxyセッションIDではなく、サーバーのセッションIDです。
    • format:計画の形式。上記と同じです。
    • svr_ip、svr_port:セッションが存在するノードのIPアドレス。デフォルトは現在のセッションが接続しているノードのIPアドレスです。

    enable_opt_trace

    機能紹介

    オプティマイザーによる実行計画の生成プロセスは非常に複雑であり、非最適な計画の問題を調査するには、関連情報を収集するために多くの時間がかかります。この機能は、オプティマイザーの全リンク追跡メカニズムを設計しており、オプティマイザーが計画を生成するために必要な完全な情報を一度に収集し、非最適な計画が生成される問題の分析を容易にします。この機能には以下の追跡情報が含まれます:

    • env:
      • システム情報、セッション情報
      • ユーザーSQL
      • オプティマイザー関連変数情報
    • transformer:
      • 各リライトルールがリライト前後のSQLをレポート
      • 各リライトルールがリライトされたりされなかったりする詳細な理由(hintの制御や何らかの条件が満たされていない場合など)
    • optimizer:
      • 使用される統計情報
      • ベーステーブルパス生成ログ(プロセス条件、行数、コスト推定情報、skyline剪枝ルールプロセスを含む)
      • join order列挙の詳細なプロセス
      • top演算子の割り当て、最適化プロセス

    関連パッケージ関数説明

    DBMS_XPLAN.ENABLE_OPT_TRACE

    DEFAULT_INENTIFIER  constant VARCHAR2(20) := '';
    DEFAULT_LEVEL       constant INT := 1;
    PROCEDURE enable_opt_trace(
        sql_id          IN VARCHAR2 DEFAULT '',
        identifier      IN VARCHAR2 DEFAULT DEFAULT_INENTIFIER,
        level           IN INT DEFAULT DEFAULT_LEVEL
    );
    

    DBMS_XPLAN.ENABLE_OPT_TRACE 関数は、オプティマイザーの全リンク追跡を有効にするために使用されます。有効になると、現在のセッションの各計画生成プロセスが追跡されます。

    パラメータ紹介:

    • sql_id は追跡対象のSQLをマークするために使用されます。例えば、現在のテストでPLプログラムを実行する必要があり、同時にPL関数内の特定のSQLのみを追跡したい場合、sql_id を設定してマークできます。sql_id を設定すると、特定のSQLのみが追跡され、設定しない場合はすべてのSQLが追跡されます。

    • level は追跡のレベルを設定します。

      • 0: デフォルト動作。
      • 1: 各モジュールの使用メモリ、時間を追加で出力。
      • 2: リライトされたりされなかったりするかに関わらず、各リライトされたquery blockに対応するSQLを追加で出力。

      注意

      level はデータベースキーワードであるため、使用する際にはOracleテナントでは二重引用符で囲み、MySQLテナントでは ` で囲む必要があります。

    • identifier はtraceファイルの拡張子をマークするために使用され、ユーザーが自身のtraceファイルを検索しやすくします。

    DBMS_XPLAN.DISABLE_OPT_TRACE

    PROCEDURE disable_opt_trace;
    

    DBMS_XPLAN.DISABLE_OPT_TRACE は、現在のセッションのオプティマイザー全リンク追跡機能を無効にするために使用されます。

    DBMS_XPLAN.SET_OPT_TRACE_PARAMETER

    PROCEDURE set_opt_trace_parameter(
        sql_id          IN VARCHAR2 DEFAULT '',
        identifier      IN VARCHAR2 DEFAULT DEFAULT_INENTIFIER,
        level           IN INT DEFAULT DEFAULT_LEVEL
    );
    

    DBMS_XPLAN.SET_OPT_TRACE_PARAMETER は、現在のセッションのオプティマイザー全リンク追跡のパラメータを変更するために使用されます。

    典型的なシナリオの診断

    クエリは実行終了できるが、実行速度が非常に遅い

    クエリ実行の詳細情報を収集します:

    Oracleテナントの使用例
    MySQLテナントの使用例
    1. Proxyがセッションを「保持」します。

      SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
      
    2. クエリを実行します。

      select * from t1;
      
    3. DBMS_XPLANパッケージを使用して、前回の実行計画を確認します。

      select * from table(dbms_xplan.display_cursor(format=>'all'));
      
      +--------------------------------------------------------------------------------------------------+
      | COLUMN_VALUE                                                                                     |
      +--------------------------------------------------------------------------------------------------+
      | ================================================================================================ |
      | |ID|OPERATOR       |NAME|EST.ROWS|EST.TIME(us)|REAL.ROWS|REAL.TIME(us)|IO TIME(us)|CPU TIME(us)| |
      | ------------------------------------------------------------------------------------------------ |
      | |0 |TABLE FULL SCAN|T1  |1       |2           |0        |0            |0          |0           | |
      | ================================================================================================ |
      | Outputs & filters:                                                                               |
      | -------------------------------------                                                            |
      |   0 - output([T1.C1]), filter(nil), rowset=256                                                   |
      |       access([T1.C1]), partitions(p0)                                                            |
      |       is_index_back=false, is_global_index=false,                                                |
      |       range_key([T1.__pk_increment]), range(MIN ; MAX)always true                                |
      +--------------------------------------------------------------------------------------------------+
      
    1. Proxyがセッションを「保持」します。

      SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
      
    2. クエリを実行します。

      select * from t1;
      
    3. DBMS_XPLANパッケージとsql_auditを使用して、前の実行計画を確認します。

      select dbms_xplan.display_cursor(0, 'all');
      
      +--------------------------------------------------------------------------------------------------+
      | COLUMN_VALUE                                                                                     |
      +--------------------------------------------------------------------------------------------------+
      | ================================================================================================ |
      | |ID|OPERATOR       |NAME|EST.ROWS|EST.TIME(us)|REAL.ROWS|REAL.TIME(us)|IO TIME(us)|CPU TIME(us)| |
      | ------------------------------------------------------------------------------------------------ |
      | |0 |TABLE FULL SCAN|T1  |1       |2           |0        |0            |0          |0           | |
      | ================================================================================================ |
      | Outputs & filters:                                                                               |
      | -------------------------------------                                                            |
      |   0 - output([T1.C1]), filter(nil), rowset=256                                                   |
      |       access([T1.C1]), partitions(p0)                                                            |
      |       is_index_back=false, is_global_index=false,                                                |
      |       range_key([T1.__pk_increment]), range(MIN ; MAX)always true                                |
      +--------------------------------------------------------------------------------------------------+
      

    クエリの実行が非常に遅く、長時間終わらない

    収集計画の実行詳細情報:

    Oracleテナントの使用例
    MySQLテナントの使用例
    1. 接続AでスローSQLを実行します。

      select count(*) from table(generator(100000)) A, table(generator(10000))B;
      
    2. システムテナントにログインし、__all_virtual_processlistをクエリして、スローSQLを実行しているセッション情報(seesion_id、svr_ip、svr_port)を特定します。

      select id, svr_ip, svr_ip, svr_port, info from __all_virtual_processlist where info like "%select%"\G
      
                      id: 3221489189
                  svr_ip: 11.xxx.xxx.xxx
                svr_port: 50000
                    info: select count(*) from table(generator(100000)) A, table(generator(10000))B
      
    3. セッションの実行計画の詳細を表示します。

      select dbms_xplan.display_active_session_plan(3221668463, 'all', '11.xxx.xxx.xxx', 50000);
      +--------------------------------------------------------------------------------------------------------------------+
      | COLUMN_VALUE                                                                                                       |
      +--------------------------------------------------------------------------------------------------------------------+
      | ==============================================================================================================     |
      | |ID|OPERATOR                     |NAME|EST.ROWS|EST.TIME(us)|REAL.ROWS|REAL.TIME(us)|IO TIME(us)|CPU TIME(us)|     |
      | --------------------------------------------------------------------------------------------------------------     |
      | |0 |SCALAR GROUP BY              |    |1       |1794        |0        |0            |0          |0           |     |
      | |1 |└─NESTED-LOOP JOIN CARTESIAN |    |39601   |1076        |0        |0            |0          |0           |     |
      | |2 |  ├─FUNCTION_TABLE           |A   |199     |1           |0        |0            |0          |0           |     |
      | |3 |  └─MATERIAL                 |    |199     |80          |0        |0            |0          |0           |     |
      | |4 |    └─FUNCTION_TABLE         |B   |199     |1           |0        |0            |0          |0           |     |
      | ==============================================================================================================     |
      | Outputs & filters:                                                                                                 |
      | -------------------------------------                                                                              |
      |   0 - output([T_FUN_COUNT(*)]), filter(nil), rowset=256                                                            |
      |       group(nil), agg_func([T_FUN_COUNT(*)])                                                                       |
      |   1 - output(nil), filter(nil), rowset=256                                                                         |
      |       conds(nil), nl_params_(nil), use_batch=false                                                                 |
      |   2 - output(nil), filter(nil)                                                                                     |
      |       value(GENERATOR(cast(:0, BIGINT(-1, 0))))                                                                    |
      |   3 - output(nil), filter(nil), rowset=256                                                                         |
      |   4 - output(nil), filter(nil)                                                                                     |
      |       value(GENERATOR(cast(:1, BIGINT(-1, 0))))                                                                    |
      +--------------------------------------------------------------------------------------------------------------------+
      
    1. 接続AでスローSQLを実行します。

      select count(*) from table(generator(100000)) A, table(generator(10000))B;
      
    2. システムテナントにログインし、__all_virtual_processlistをクエリして、スローSQLを実行しているセッション情報(seesion_id、svr_ip、svr_port)を特定します。

      select id, svr_ip, svr_ip, svr_port, info from __all_virtual_processlist where info like "%select%"\G
      
                      id: 3221489189
                  svr_ip: 11.xxx.xxx.xxx
                svr_port: 50000
                    info: select count(*) from table(generator(100000)) A, table(generator(10000))B
      
    3. セッションの実行計画の詳細を表示します。

      select dbms_xplan.display_active_session_plan(3221668463, 'all', '11.xxx.xxx.xxx', 50000);
      +--------------------------------------------------------------------------------------------------------------------+
      | COLUMN_VALUE                                                                                                       |
      +--------------------------------------------------------------------------------------------------------------------+
      | ==============================================================================================================     |
      | |ID|OPERATOR                     |NAME|EST.ROWS|EST.TIME(us)|REAL.ROWS|REAL.TIME(us)|IO TIME(us)|CPU TIME(us)|     |
      | --------------------------------------------------------------------------------------------------------------     |
      | |0 |SCALAR GROUP BY              |    |1       |1794        |0        |0            |0          |0           |     |
      | |1 |└─NESTED-LOOP JOIN CARTESIAN |    |39601   |1076        |0        |0            |0          |0           |     |
      | |2 |  ├─FUNCTION_TABLE           |A   |199     |1           |0        |0            |0          |0           |     |
      | |3 |  └─MATERIAL                 |    |199     |80          |0        |0            |0          |0           |     |
      | |4 |    └─FUNCTION_TABLE         |B   |199     |1           |0        |0            |0          |0           |     |
      | ==============================================================================================================     |
      | Outputs & filters:                                                                                                 |
      | -------------------------------------                                                                              |
      |   0 - output([T_FUN_COUNT(*)]), filter(nil), rowset=256                                                            |
      |       group(nil), agg_func([T_FUN_COUNT(*)])                                                                       |
      |   1 - output(nil), filter(nil), rowset=256                                                                         |
      |       conds(nil), nl_params_(nil), use_batch=false                                                                 |
      |   2 - output(nil), filter(nil)                                                                                     |
      |       value(GENERATOR(cast(:0, BIGINT(-1, 0))))                                                                    |
      |   3 - output(nil), filter(nil), rowset=256                                                                         |
      |   4 - output(nil), filter(nil)                                                                                     |
      |       value(GENERATOR(cast(:1, BIGINT(-1, 0))))                                                                    |
      +--------------------------------------------------------------------------------------------------------------------+
      

    プランの生成時間が非常に長い、またはプラン生成中にメモリ不足で予期しないプランが生成された場合

    クエリ最適化情報の収集:

    Oracleテナントの使用例
    MySQLテナントの使用例
    1. Proxyがセッションを「保持」します。

      SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
      
    2. 現在のセッションのオプティマイザー追跡機能を有効にします。

      call dbms_xplan.enable_opt_trace();
      
    3. 追跡ログのレベルとログファイルの拡張子を設定します。

      call dbms_xplan.set_opt_trace_parameter(identifier=>'trace_test', "level"=>3);
      
    4. クエリ計画を照会します。

      explain select * from t1;
      
    5. observer ログディレクトリ内で、trace_test を拡張子とする追跡ログを確認します。

      vi /home/admin/oceanbase/log/optimizer_trace_BkkGn1_trace_test.trac
      
    6. 現在のセッションのオプティマイザー追跡機能を無効にします。

      call dbms_xplan.disable_opt_trace();
      
    1. Proxyがセッションを「保持」します。

      SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
      
    2. 現在のセッションのオプティマイザー追跡機能を有効にします。

      call dbms_xplan.enable_opt_trace();
      
    3. 追跡ログのレベルとログファイルの拡張子を設定します。

      call dbms_xplan.set_opt_trace_parameter(identifier=>'trace_test', `level`=>3);
      
    4. クエリ計画を照会します。

      explain select * from t1;
      
    5. observer ログディレクトリで、trace_test を拡張子とする追跡ログを確認します。

      vi /home/admin/oceanbase/log/optimizer_trace_BkkGn1_trace_test.trac
      
    6. 現在のセッションのオプティマイザー追跡機能を無効にします。

      call dbms_xplan.disable_opt_trace();
      

    情報の解釈

    plan tableのフィールド紹介

    フィールド
    説明
    OPERATOR 演算子名
    NAME スキャンするテーブル名
    EST.ROWS オプティマイザーが推定した出力行数
    EST.TIME(us) オプティマイザーが推定した演算子終了計算時間
    REAL.ROWS 現在の演算子の実際の出力行数
    REAL.TIME(us) 現在の演算子の実際の終了計算時間
    IO TIME(us) 現在の演算子の待機時間(単位:マイクロ秒)。EXCHANGE IN、EXCHANGE OUT、PX COORD演算子については、この時間はネットワーク待機時間を示します。
    CPU TIME(us) 現在の演算子のCPU時間(単位:マイクロ秒)。EXCHANGE IN、EXCHANGE OUT、PX COORD演算子については、この時間は実際のネットワークオーバーヘッドではないため、注意は不要です。

    optimizer infoの紹介

    Optimization Info:
    -------------------------------------
      t1:
          table_rows:3
          physical_range_rows:1
          logical_range_rows:1
          index_back_rows:0
          output_rows:1
          table_dop:1
          dop_method:Table DOP
          avaiable_index_name:[idx_ct, idx_pc, t1]
          pruned_index_name:[idx_ct, idx_pc]
          stats version:0
          dynamic sampling level:0
          estimation method:[DEFAULT]
      Plan Type:
          DISTRIBUTED
      Note:
          Degree of Parallelisim is 1 because of table property
    
    プロパティ名
    説明
    table_rows t1 テーブルの元の行数
    physical_range_rows t1 テーブルでインデックス上をスキャンする必要がある物理行数
    logical_range_rows t1 テーブルでインデックス上をスキャンする必要がある論理行数
    index_back_rows t1 テーブルで再テーブルアクセスが必要な行数
    output_rows t1 テーブルでフィルタリング後の行数
    table_dop t1 テーブルスキャンの並列度
    dop_method テーブルスキャンの並列度を決定する要因。TableDOP(テーブル定義の並列度)、AutoDop(オプティマイザーがコストに基づいて選択する並列度、auto dop機能を有効にする必要があります)、global parallel(parallel hintまたはシステム変数で設定された並列度)が該当します。
    available_index_name t1 テーブルで利用可能なインデックスのリスト
    pruned_index_name 現在のクエリでルールに基づいて削除されたインデックスのリスト
    stats_version t1 テーブルの統計情報バージョン番号。値が0の場合、そのテーブルの統計情報が収集されていないことを意味します。計画の正しい生成を保証するため、手動でそのテーブルの統計情報を収集してください。
    dynamic_sampling_level 動的サンプリング(オプティマイザーの最適化ツール。詳細については公式ドキュメントを参照してください)のレベル。値が0の場合、そのテーブルで動的サンプリングが使用されていないことを意味します
    estimation_method t1 テーブルの行数推定方法。DEFAULT(デフォルトの統計情報を使用。この場合、行数の推定は非常に不正確であり、DBAによる最適化が必要です)、STORAGE(ストレージ層を使用したリアルタイム行数推定)、STATS(統計情報を使用した行数推定)が該当します。
    Plan Type 現在の計画タイプ。LOCAL、REMOTE、DISTRIBUTEDが該当します
    Note この計画を生成した際のメモ情報。例:「Degree of Parallelisim is 1 because of table property」は、現在のテーブルの並列度が1に設定されているため、現在のクエリの並列度も1に設定されたことを示しています。

    プランのパフォーマンスが悪い原因を迅速に特定する

    1. CPU TIMEが高いトップNの演算子を見つけ、EXCHANGE IN、EXCHANGE OUT、PX COORDなどの演算子を除外します。以下の演算子がある場合は:

      • TABLE SCAN:Output & filter情報で、is_index_back=trueのテーブル再アクセスがないか確認します。ある場合は、optimizer info内のindex_back_rowsに注目し、行数が多い場合はインデックスの最適化が必要です。REAL.ROWSがEST.ROWSよりもはるかに高い場合は、統計情報が収集されているか、統計情報が古くなっていないか確認する必要があります(optimizer infoのstats versionフィールドで確認)。両方ともある場合は、case whenやlikeなどの複雑なフィルター条件がないか確認します。この場合、動的サンプリングを手動で有効にすることで、/+dynamic_sampling(1)/、推定行数の精度を向上させることができます。この演算子がNested Loop JoinやSubPlan Filter演算子の右側にある場合、rescanが多すぎてオーバーヘッドが大きいことを意味します。
      • Nested Loop Join:まず、左側の演算子の行数推定が正しいかどうか確認します。行数の偏差が大きい場合は、統計情報の問題を確認するか、動的サンプリングを有効にして推定行数の精度を向上させるために、/+dynamic_sampling(1)/を使用します。これらが効果がない場合は、/+use_hash(xxx)/を使用して他のプランをバインドします。行数推定が正常でもパフォーマンスが悪い場合は、Output & filter情報を確認し、batch_joinが使用されていないかどうか確認する必要があります。
      • SubPlan Filter:まず、左側の演算子の行数推定が正しいかどうか確認します。行数の偏差が大きい場合は、統計情報の問題を確認するか、動的サンプリングを有効にして推定行数の精度を向上させるために、/+dynamic_sampling(1)/を使用します。行数推定が正常でもパフォーマンスが悪い場合は、Output & filter情報を確認し、batchが使用されていないかどうか確認する必要があります。上記の方法がすべて無効な場合は、SQL内で対応するサブクエリを見つけ、/+unnest/で書き換えて最適化できないか確認する必要があります。

      その他の比較的遅い演算子については、推定行数と統計情報の状態に注目します。統計情報を収集したり動的サンプリングを有効にしても改善が見られない場合は、データ量が大きいことが原因です。並列実行を有効にする必要があります。/+parallel(xxx)/。INSERT、UPDATE、DELETE、MERGEタイプの演算子については、PDMLを追加で有効にして最適化する必要があります。/+parallel(xxx) enable_parallel_dml/。

    2. HASH DISTINCT、SORT、HASH GROUP BY、HASH JOINなどの演算子でIO TIMEが発生している場合、これらの演算子にデータが永続化されている可能性があるため、sql_work_area_sizeパラメータを適切に調整できます。

    opt_traceログの解読

    この部分を理解するには、オプティマイザーの基礎知識とOceanBaseオプティマイザーの基本的な動作原理を理解している必要があります。これには、反復的なクエリ書き換えプロセス、インデックス最適化、接続列挙、分散プラン最適化などが含まれます。

    opt_traceログは以下の情報を記録します:

    transformer:

    • 各書き換えルールは、書き換え前後のSQLを報告します。
    • 各書き換えルールが書き換えられたり書き換えられなかったりした詳細な理由(hintの制御や何らかの条件が満たされていないことなど)。

    optimizer:

    • 使用された統計情報
    • 基本テーブルパス生成ログ(プロセス条件、行数、コスト推定情報、skyline剪枝ルールプロセスを含む)
    • join order列挙の詳細なプロセス
    • トップ演算子の割り当て、最適化プロセス

    同時に、ログは各モジュール終了後に時間とメモリ使用量を記録します:

    SECTION TIME USAGE: 233135 us
    TOTAL TIME USAGE: 233135 us
    SECTION MEM USAGE: 48744 KB
    TOTAL MEM USAGE: 62961 KB
    
    • SECTION TIME USAGEは、前の最適化ステップ終了から現在の最適化ステップ終了までに使用された時間を表します。
    • TOTAL TIME USAGEは、クエリ最適化開始から現在の最適化ステップ終了までに使用された時間を表します。
    • SECTION MEM USAGEは、前の最適化ステップ終了から現在の最適化ステップ終了までに使用されたテナントメモリを表します。
    • TOTAL MEM USAGEは、クエリ最適化開始から現在の最適化ステップ終了までに使用されたテナントメモリを表します。

    この情報により、プラン生成に時間とメモリを消費する最適化ステップを迅速に特定できます。また、hintを使用して対応する最適化機能を無効にすることで、問題を迅速に解決できます。これにより、プラン生成のオーバーヘッドを削減するために、無理やりno_rewriteを使用して書き換え全体を無効にする必要はなくなります。

    関連ドキュメント

    • DBMS_XPLANシステムパッケージの詳細については、DBMS_XPLAN(MySQLモード)を参照してください。 )およびDBMS_XPLAN(Oracleモード)

    前のトピック

    データ可視化
    最後

    次のトピック

    診断の実践:SQL_PLAN_MONITORを使用したパフォーマンス問題の分析
    次
    このページの内容
    システムパッケージについて
    display_cursor
    display_active_session_plan
    enable_opt_trace
    典型的なシナリオの診断
    クエリは実行終了できるが、実行速度が非常に遅い
    クエリの実行が非常に遅く、長時間終わらない
    プランの生成時間が非常に長い、またはプラン生成中にメモリ不足で予期しないプランが生成された場合
    情報の解釈
    plan tableのフィールド紹介
    optimizer infoの紹介
    プランのパフォーマンスが悪い原因を迅速に特定する
    opt_traceログの解読
    関連ドキュメント