DB2のINSERTパフォーマンスを向上させるためのヒント (1)
INSERT処理の概要
まず、行を挿入する際の処理手順について簡単に説明します。これらの各ステップには最適化の可能性がありますが、それについては後ほど説明します。
- クライアントでステートメントを準備する。動的SQLの場合、このステップはステートメントが実行される前に行われ、ここでパフォーマンスが重要になります。静的SQLの場合、ステートメントの準備は事前に行われるため、このステップはあまり関係ありません。
- クライアントで、挿入する行の個々の列の値を組み立て、DB2 サーバーに送信します。
- DB2サーバーは、行を挿入するページを決定します。
- DB2 は、そのページで使用されるバッファプールの場所を予約します。DB2 が既存のページを選択する場合は、ディスクを読み込む必要があります。新しいページを使用する場合は、表領域(SMS の場合はシステムマネージドストアの表領域)にそのページ用の領域が物理的に確保されます。新しい行が挿入された各ページは、最終的にバッファプールからディスクに書き込まれる。
- 対象ページの行をフォーマットし、その行のX(排他)行ロックを取得します。
- この挿入を反映した行をログバッファに書き込む。
- 最後に、挿入を含むトランザクションをコミットし、ログバッファのレコードをログファイルに書き込みます(その時点でまだログファイルに書き込まれていない場合)。
インサートの代替
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からの読み込み
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...] [...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...] [...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...] [...] [...] [...]
[...]
[...]
[...] [...] [...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...] [...]
[...]
[...]
[...] [...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...] [...] [...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
解決する db2トランザクションログがいっぱいで、ログのディスク容量がいっぱいです問題の詳細な解決方法
-
空のIBM DB2 ECOデータベースを作成する方法
-
DB2アクティビティログフルの原因を分析し、DB2ログフルの方法と回避策を解決します。
-
SQL Server Connection Server を使用して DB2 Server にアクセスする
-
DB2 における REVERSE 関数の実装
-
DB2 現在のユーザーテーブル、フィールド、インデックスなどの詳細を取得します。
-
SQL Server 2008 Management Studio Expressのインストール方法
-
DB2 9 データサーバーの開発(全3回
-
DB2におけるデータの移動(I)
-
CentOSでのDB2データベースインストール手順詳細