1. ホーム
  2. データベース
  3. デービーツー

DB2のINSERTパフォーマンスを向上させるためのヒント (1)

2022-01-08 23:20:18
私が見ているdb2チュートリアルは DB2でINSERTのパフォーマンスを向上させるコツ(1)です。

INSERT処理の概要
まず、行を挿入する際の処理手順について簡単に説明します。これらの各ステップには最適化の可能性がありますが、それについては後ほど説明します。

  1. クライアントでステートメントを準備する。動的SQLの場合、このステップはステートメントが実行される前に行われ、ここでパフォーマンスが重要になります。静的SQLの場合、ステートメントの準備は事前に行われるため、このステップはあまり関係ありません。
  2. クライアントで、挿入する行の個々の列の値を組み立て、DB2 サーバーに送信します。
  3. DB2サーバーは、行を挿入するページを決定します。
  4. DB2 は、そのページで使用されるバッファプールの場所を予約します。DB2 が既存のページを選択する場合は、ディスクを読み込む必要があります。新しいページを使用する場合は、表領域(SMS の場合はシステムマネージドストアの表領域)にそのページ用の領域が物理的に確保されます。新しい行が挿入された各ページは、最終的にバッファプールからディスクに書き込まれる。
  5. 対象ページの行をフォーマットし、その行のX(排他)行ロックを取得します。
  6. この挿入を反映した行をログバッファに書き込む。
  7. 最後に、挿入を含むトランザクションをコミットし、ログバッファのレコードをログファイルに書き込みます(その時点でまだログファイルに書き込まれていない場合)。
さらに、インデックスやトリガーの有無など、データベースの構成に応じて、さまざまな種類の追加処理が発生する可能性があります。後述するように、この追加処理もパフォーマンスにとって重要である。

インサートの代替
insertの最適化について詳しく説明する前に、insertの代替となるloadとimportの2つについて考えてみましょう。importユーティリティは、実際にはSQL INSERTのフロントエンドですが、同様に便利な機能をいくつか持っています。 loadにも便利な追加機能がありますが、loadをinsertの代わりに使用する主な理由は、パフォーマンスを向上させるためです。

load はデータページを直接フォーマットするので、insert による各行の処理のオーバーヘッドの多くを回避できます (例えば、ここではロギングが効果的に排除されます)。また、loadはマルチプロセッサマシンでの並列処理をより有効に活用することができます。V8 loadには、loadをinsertの代替とするために特に有効な2つの新機能があります。カーソルからのloadとコールレベルインターフェース(CLI)アプリケーションからのloadがそれです。

カーソルからの読み込み
この方法は、アプリケーションのプログラムコード(db2Load APIを使用)、またはDB2スクリプトに使用することができます。以下は、後者のシナリオの例です。

declare staffcursor cursor forselect * from staff; 

load from staffcursor of cursor insert into myschema.new_staff;
この2行は、次の行に置き換えることができます。
insert into myschema.new_staff select * from staff



同等のINSERT ... SELECTステートメントで、カーソルからロードすることにより、ほぼ20%の性能向上が期待できます。

CLIからの読み込み
[...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...]   [...] [...] [...] [...] [...] [...] [...] [...] [...]