MySQL 8.0 リファレンスマニュアル


27.12.6.4 prepared_statements_instances テーブル

パフォーマンススキーマはプリペアドステートメントのインストゥルメンテーションを提供しますが、次の 2 つのプロトコルがあります:

  • バイナリプロトコル。 これには MySQL C API を介してアクセスし、次のテーブルに示すように基礎となるサーバーコマンドにマップします。

    C API 関数 対応するサーバーコマンド
    mysql_stmt_prepare() COM_STMT_PREPARE
    mysql_stmt_execute() COM_STMT_EXECUTE
    mysql_stmt_close() COM_STMT_CLOSE
  • テキストプロトコル。 これには SQL ステートメントを使用してアクセスし、次のテーブルに示すように基礎となるサーバーコマンドにマップします。

    SQL ステートメント 対応するサーバーコマンド
    PREPARE SQLCOM_PREPARE
    EXECUTE SQLCOM_EXECUTE
    DEALLOCATE PREPARE, DROP PREPARE SQLCOM_DEALLOCATE PREPARE

パフォーマンススキーマプリペアドステートメントインストゥルメンテーションは、両方のプロトコルに対応しています。 次の説明では、C API 関数または SQL ステートメントではなくサーバーコマンドについて説明します。

プリペアドステートメントに関する情報は、prepared_statements_instances テーブルにあります。 このテーブルは、サーバーで使用されるプリペアドステートメントの検査を有効にし、それらに関する集計された統計を提供します。 このテーブルのサイズを制御するには、サーバーの起動時に performance_schema_max_prepared_statements_instances システム変数を設定します。

プリペアドステートメント情報の収集は、次のテーブルに示すステートメントインストゥルメントによって異なります。 これらのインストゥルメントはデフォルトで有効になっています。 これらを変更するには、setup_instruments テーブルを更新します。

金融商品 サーバーコマンド
statement/com/Prepare COM_STMT_PREPARE
statement/com/Execute COM_STMT_EXECUTE
statement/sql/prepare_sql SQLCOM_PREPARE
statement/sql/execute_sql SQLCOM_EXECUTE

パフォーマンススキーマは、prepared_statements_instances テーブルの内容を次のように管理します:

  • ステートメントの準備

    COM_STMT_PREPARE または SQLCOM_PREPARE コマンドは、サーバーにプリペアドステートメントを作成します。 ステートメントが正常にインスツルメント処理されると、新しい行が prepared_statements_instances テーブルに追加されます。 ステートメントを計測できない場合は、Performance_schema_prepared_statements_lost ステータス変数が増分されます。

  • プリペアドステートメントの実行

    インスツルメント処理されたプリペアドステートメントインスタンスに対して COM_STMT_EXECUTE または SQLCOM_PREPARE コマンドを実行すると、対応する prepared_statements_instances テーブルの行が更新されます。

  • プリペアドステートメントの割当て解除

    インスツルメント処理されたプリペアドステートメントインスタンスに対して COM_STMT_CLOSE または SQLCOM_DEALLOCATE_PREPARE コマンドを実行すると、対応する prepared_statements_instances テーブルの行が削除されます。 リソースリークを回避するために、前述のプリペアドステートメントインストゥルメントが無効になっていても、削除が行われます。

prepared_statements_instances テーブルには、次のカラムがあります:

  • OBJECT_INSTANCE_BEGIN

    インストゥルメントされたプリペアドステートメントのメモリー内のアドレス。

  • STATEMENT_ID

    サーバーによって割り当てられた内部ステートメント ID。 テキストプロトコルとバイナリプロトコルはどちらもステートメント ID を使用します。

  • STATEMENT_NAME

    バイナリプロトコルの場合、このカラムは NULL です。 テキストプロトコルの場合、このカラムはユーザーによって割り当てられた外部ステートメントの名前です。 たとえば、次の SQL ステートメントの場合、プリペアドステートメントの名前は stmt です:

    PREPARE stmt FROM 'SELECT 1';
  • SQL_TEXT

    ? プレースホルダマーカーを使用したプリペアドステートメントのテキスト。

  • OWNER_THREAD_ID, OWNER_EVENT_ID

    これらのカラムは、プリペアドステートメントを作成したイベントを示します。

  • OWNER_OBJECT_TYPE, OWNER_OBJECT_SCHEMA, OWNER_OBJECT_NAME

    クライアントセッションによって作成されたプリペアドステートメントの場合、これらのカラムは NULL です。 ストアドプログラムによって作成されたプリペアドステートメントの場合、これらのカラムはストアドプログラムを指します。 一般的なユーザーエラーは、プリペアドステートメントの割当て解除を忘れたことです。 これらのカラムを使用すると、プリペアドステートメントをリークするストアドプログラムを見つけることができます:

    SELECT
      OWNER_OBJECT_TYPE, OWNER_OBJECT_SCHEMA, OWNER_OBJECT_NAME,
      STATEMENT_NAME, SQL_TEXT
    FROM performance_schema.prepared_statements_instances
    WHERE OWNER_OBJECT_TYPE IS NOT NULL;
  • TIMER_PREPARE

    ステートメントの準備自体の実行に要した時間。

  • COUNT_REPREPARE

    ステートメントが内部的に再準備された回数 (セクション8.10.3「プリペアドステートメントおよびストアドプログラムのキャッシュ」 を参照)。 再準備のタイミング統計は、個別の操作としてではなくステートメントの実行の一部としてカウントされるため、使用できません。

  • COUNT_EXECUTE, SUM_TIMER_EXECUTE, MIN_TIMER_EXECUTE, AVG_TIMER_EXECUTE, MAX_TIMER_EXECUTE

    プリペアドステートメントの実行の集計統計。

  • SUM_xxx

    残りの SUM_xxx カラムは、ステートメントサマリーテーブルと同じです (セクション27.12.18.3「ステートメントサマリーテーブル」 を参照)。

prepared_statements_instances テーブルには次のインデックスがあります:

  • 主キー (OBJECT_INSTANCE_BEGIN)

  • (STATEMENT_ID) のインデックス

  • (STATEMENT_NAME) のインデックス

  • (OWNER_THREAD_IDOWNER_EVENT_ID) のインデックス

  • (OWNER_OBJECT_TYPE, OWNER_OBJECT_SCHEMA, OWNER_OBJECT_NAME) のインデックス

TRUNCATE TABLE により、prepared_statements_instances テーブルの統計カラムがリセットされます。


関連キーワード:  テーブル, パフォーマンス, スキーマ, instances, statements, プリペアドステートメント, ステートメント, prepared, PREPARE, OWNER