すべてのプロダクト
Search
ドキュメントセンター

PolarDB:複数行挿入テーブル AM インフラストラクチャ

最終更新日:Jun 06, 2025

PolarDB for PostgreSQL クラスタは、2 種類のテーブルアクセス方式(AM)インターフェースを提供します。単一行挿入インターフェースと一括挿入インターフェースです。大量のタプルを挿入するには、一括挿入インターフェースを有効にすることでデータ挿入効率を向上させることができます。

前提条件

PolarDB for PostgreSQL クラスタは、次のデータベースエンジンバージョンのいずれかを実行している必要があります。

  • PolarDB for PostgreSQL 16 リビジョンバージョン 2.0.16.8.3.0 以降

  • PolarDB for PostgreSQL 15 リビジョンバージョン 2.0.15.12.4.0 以降

  • PolarDB for PostgreSQL 14 リビジョンバージョン 2.0.14.13.28.0 以降

説明

PolarDB コンソールで、または SHOW polardb_version; 文を実行することで、クラスタの リビジョンバージョンを確認できます。リビジョンバージョンが要件を満たしていない場合は、更新してください。

背景情報

PostgreSQL では、AM はテーブルまたはインデックスのストレージメカニズムを定義および実装します。エグゼキュータは、データ行またはインデックス行を テーブル AM および インデックス AM にそれぞれ渡すだけで済み、AM の実装について考慮する必要はありません。

PostgreSQL 12 以降のバージョンでは、拡張可能なテーブル AM が導入されています。現在、組み込みのヒープ AM のみがサポートされています。ヒープ AM は、次の 2 つのインターフェース定義をサポートしています。

  • 一括挿入インターフェース:一度に複数のデータ行を処理し、COPY FROM 構文のみをサポートします。

  • 単一行挿入インターフェース:一度に 1 つのデータ行を処理し、COPY FROM 構文を除く、テーブルデータ挿入に関連するすべての構文に適用できます。

大量のタプルを挿入する必要がある場合、単一行挿入アルゴリズムの効率は一括挿入よりも大幅に低くなります。ただし、一括挿入ではタプルを一括して一時的に保存し、これらのタプルのライフサイクル全体を処理する必要があります。

これらの問題に対処するため、PolarDB for PostgreSQL は新しいオプションのテーブル AM インターフェースを拡張し、ヒープ AM 用にこれらのインターフェースを実装しています。新しいインターフェースは、次の最適化を提供します。

  • 一括挿入のエンドツーエンド管理を提供します。

  • ヒープ AM により効率的な挿入アルゴリズムとログ先行書き込み(WAL)を使用します。

その結果、複数のデータ行を挿入する可能性のある他の構文も、このテーブル AM インターフェースセットを通じてバッチ挿入機能を使用できます。ヒープ AM の単一行挿入インターフェースと一括挿入インターフェースはどちらも、ヒープテーブルの論理レプリケーションをサポートしています。

使用上の注意

現在、次の構文は一括挿入テーブル AM インターフェースの使用をサポートしています。

説明

これらの構文が一括挿入 AM インターフェースを使用できるかどうかは、wal_level パラメータ値によって異なります。値が logical の場合、これらの構文はデフォルトで一括挿入インターフェースを使用できます。値が logical でない場合は、一括インポートインフラストラクチャ を使用して、一括インポート操作を最適化できます。

仕組み

バッファレイヤーアルゴリズム

単一行挿入アルゴリズム

単一行挿入を実行するには、次の手順に従います。

  1. 挿入するタプルを構築します。

  2. ディスクページにタプルを格納するために必要な領域の量を決定します。

  3. タプルを格納するのに十分な空き領域があるページを見つけます。

  4. ページをロックし、タプルをページに配置します。

  5. ページをダーティとしてマークします。

  6. ページの変更をキャプチャするために WAL ログエントリを生成します。

  7. ページのロックを解除します。

一括挿入アルゴリズム

一括挿入を実行するには、次の手順に従います。

  1. バッチのタプルをメモリに一時的に保存します。

  2. タプル情報を一括して構築します。

  3. タプルを格納するのに十分な空き領域があるページを見つけます。

  4. ページをロックし、タプルをページに配置します。

  5. ページに十分な領域が残っている場合は、ページの領域がなくなるか、一時的に保存されたすべてのタプルが処理されるまで、タプルの挿入を続けます。

  6. ページをダーティとしてマークします。

  7. ページの変更をキャプチャするために WAL ログエントリを生成します。

  8. ページのロックを解除します。

WAL ログ形式

  • 単一行挿入用のヒープ INSERT タイプログ。

    -[ RECORD 1 ]----+--------------------------------------------
    start_lsn        | 0/40BE24E0  /* 開始 LSN */
    end_lsn          | 0/40BE2520  /* 終了 LSN */
    prev_lsn         | 0/40BE24B8  /* 前の LSN */
    xid              | 792         /* トランザクション ID */
    resource_manager | Heap        /* リソースマネージャー */
    record_type      | INSERT      /* レコードタイプ */
    record_length    | 61          /* レコード長 */
    main_data_length | 3           /* メインデータ長 */
    fpi_length       | 0           /* FPI 長 */
    description      | off: 8, flags: 0x00 /* 説明 */
    block_ref        | blkref #0: rel 1663/5/16412 fork main blk 0 /* ブロック参照 */
    
  • 一括行挿入用の Heap2 MULTI_INSERT ログ。このログタイプは、ページに一度に挿入された複数のデータ行を記録できます。

    -[ RECORD 1 ]----+------------------------------------------------------------------
    start_lsn        | 0/40BE2548 /* 開始 LSN */
    end_lsn          | 0/40BE2610 /* 終了 LSN */
    prev_lsn         | 0/40BE2520 /* 前の LSN */
    xid              | 793        /* トランザクション ID */
    resource_manager | Heap2       /* リソースマネージャー */
    record_type      | MULTI_INSERT /* レコードタイプ */
    record_length    | 194         /* レコード長 */
    main_data_length | 20          /* メインデータ長 */
    fpi_length       | 0           /* FPI 長 */
    description      | ntuples: 8, flags: 0x02, offsets: [9, 10, 11, 12, 13, 14, 15, 16] /* 説明 */
    block_ref        | blkref #0: rel 1663/5/16412 fork main blk 0 /* ブロック参照 */
    

差異分析

一括挿入アルゴリズムは、ページロック頻度を大幅に削減し、生成される WAL レコードの数を減らし、ログコンテンツのコンパクトさを最適化できます。

使用方法

polar_enable_tableam_multi_insert パラメータは、一括挿入テーブル AM インターフェースを有効にするかどうかを指定します。これはデフォルトで有効になっています。

SHOW polar_enable_tableam_multi_insert;
 polar_enable_tableam_multi_insert
-----------------------------------
 on
(1 row)