カラム・オーガナイズ表における並列 INSERT

表にデータを追加する方法は複数あります。 例えば、LOAD ユーティリティーは効率的ですがログに記録されず、表に対する並行変更も許可されません。 一方、並行アクセスが必要な場合は INSERT ステートメントがより適していて、ログにも記録されますが、通常 LOAD ほど高速ではありません。 サポートされている、カラム・オーガナイズ表をターゲットとする並列 INSERT は、一括 INSERT の高速化に役立ちます。

INSERT ステートメントは、データベース・パーティションがあるシステムでは並列化することができます。 ただし、非パーティション・データベース内の場合、またはコアがデータベース・パーティションよりも多く存在している場合、並列処理はその最大限度までは使用されません。 照会内並列処理が使用可能になっている場合、ソースへのアクセスと処理をうまく並列化できますが、ターゲット表へのデータの挿入操作は直列化されます。

Db2®では、カラム・オーガナイズ表への並列挿入を可能にする機能拡張が有効になりました。 カラム・オーガナイズ表へのデータの並列挿入のパフォーマンスを大幅に向上させることができます。 このパフォーマンスの向上は、非パーティション・データベース内にあるコア数、または 1 つのデータベース・パーティション当たりのコア数に依存します。

並列 INSERT の概要

並列 INSERT 機能によって、個々の INSERT ステートメントのパフォーマンスが大幅に向上し、革新的かつ強力な BLU Acceleration のテクノロジーがさらに強化されます。 パーティション・データベース・システム (DPF) では、この機能を使用不可にしていても、データベース・パーティション・レベルの並列化が既にある程度存在しています。 さらに、照会内並列処理が構成されている場合、並列 INSERT 機能では各データベース・パーティション内で INSERT を並列化します。

以前のバージョンの Db2 では、並列 INSERT 機能が使用不可になっている場合、INSERT ステートメントの照会部分は並列化されますが、INSERT 自体は順次実行されます。 この機能を使用可能にした場合、照会の INSERT 部分ではデータ挿入用にスレッドを複数使用して、ステートメントの経過時間を短縮します。 この並列処理は、関連する操作 (圧縮、ロック、およびロギングが含まれる) に拡張されます。 並列処理の度合いは、オプティマイザーによって自動的かつ適切に選択されます。

INSERT の並列化は、カラム・オーガナイズ表と、NOT LOGGED カラム・オーガナイズ宣言済みグローバル一時表 (DGTT) の両方に適用されます。 INSERT のソースは、行オーガナイズ表またはカラム・オーガナイズ表にできます。 ターゲットとしてはカラム・オーガナイズ表だけが並列化されます。

オプティマイザーによって INSERT に対して選択される並列処理の DEGREE (度合い) は、EXPLAIN_ARGUMENT 表の RETURN 演算子に示されます。

表 1. DEGREE 引数タイプの説明
ARGUMENT_TYPE ARGUMENT_VALUE 説明
DEGREE INTEGER RETURN 演算子が、行の挿入、更新、または削除のカラム・オーガナイズ・データ処理から戻ることを表す場合、DEGREE 引数は、挿入、更新、または削除操作の並列処理に使用されるカラム・オーガナイズ処理のサブエージェントの数を示します。

並列 INSERT を実行できないシナリオ

並列処理の実装はそれぞれの並列の LOAD エージェントがそれ自体のページにデータを入れるものなので、並列処理は大規模な一括 INSERT に使用されます。 パフォーマンスとディスク・スペースの消費との間の妥協点として、並列処理は数行が挿入される INSERT ステートメントでは使用可能にされません。 このような別々のページに入れられる少量のデータによって、表はフラグメント化されます。

VALUES 節からの INSERT は、このカテゴリーに分類されるよくある一般的なシナリオです。 1 つのステートメントの VALUES 節には通常、数行しか含まれていないため、VALUES 節からの INSERT は、ほとんどの場合並列化されません。 INGEST コマンドでも同様です。 このコマンドはバックグラウンドで、VALUES が指定された複数の個々の INSERT ステートメントとして送信されます。そのため、データベース・パーティション内で並列化される可能性はほとんどありません。

通常のソース表からの一括 INSERT の場合でも、 Db2 は、ソース副照会から生成される行の数を認識しないことがあります。 Db2 オプティマイザーは、INSERT が並列化されるかどうか、および並列化される度合いを決定します。 挿入される行数がそれほど多くないとオプティマイザーが見積もった場合、ステートメントの INSERT の部分を並列化しません。

これは、ソース表で統計を収集できないシナリオや、オプティマイザーが副照会の結果の行数を少なく見積もる可能性がある複雑な副照会に関連しています。 このため、統計が収集されなかった場合や、最後の RUNSTATS 以降に表が大幅に変更された場合は、ソース表に対して RUNSTATS を実行することが重要です。 また、1 つの表に複数の述部が存在する場合、RUNSTATS の一部として列グループ統計の収集が必要になることもあります。 ここで、「複数の述部」とは、複数のローカル述部、または統計的に相関関係のある可能性がある列に基づく 2 つの表間の複数の結合述部と解釈できます。

並列 INSERT がサポートされないシナリオ

並列 INSERT は次のシナリオではサポートされません。

  • 行オーガナイズ表への並列 INSERT はサポートされません。 INSERT のソースは、行オーガナイズ表またはカラム・オーガナイズ表のいずれかにできます。
  • IMPORT は、1 行ごとに 1 つの INSERT ステートメントを使用するため、並列化されません。
  • ネストされた INSERT がある複合ステートメントは並列化されません。 また、data-change-table-reference 節を使用する MERGE ステートメントとその他のステートメントも並列化されません。
  • 非コミット DELETE または非コミット UPDATE の後に INSERT を実行するトランザクションで並列化を行うには、INSERT の前に COMMIT が必要です。

INSERT の前の変更ステートメント (DELETE) の存在が並列処理を妨げている、LOCK TABLE を使用した一連の操作:
  1. LOCK TABLE X IN EXCLUSIVE MODE
  2. DELETE * FROM X
  3. INSERT INTO X SELECT * FROM Y [並列化されない]
  4. COMMIT