アプリケーションのために実行されるロギング量は、
変更されるデータ量により異なります。
このタスクについて
SQL ステートメントの中にはきわめて強力なステートメントがあり、1 つのステートメントで大量データの修正が可能です。 次のようなステートメントが該当します。
- 全選択を指定した INSERT。
- 照会の結果に応じて、大量のデータを表またはビューに挿入できます。
- 一括削除および一括更新(セグメント化(非UTS)表スペースまたはユニバーサル表スペース内の表のすべての行を削除する場合を除く)
非セグメント表スペースの場合、これらの各ステートメントを
実行すると、変更されるすべてのデータベース・データがログに
記録されます。 例えば、表に 2 億行のデータが記録されている
場合、SQL DELETE ステートメントによりその表からすべての行が
削除されると、そのデータと制御情報がログに記録されます。 この操作実行時には、中間のコミット・ポイントは取られません。
セグメント化(非UTS)表スペースおよびユニバーサル表スペースの場合、一括削除は、以下のいずれかの条件が満たされた場合に、削除されたレコードのデータのロギングに結果を記録します。
- 表が参照制約の親表。
- 表が DATA CAPTURE(CHANGES) として定義されている。これによって、特定の SQL 操作に
対して追加情報がログ記録されます。
- 削除トリガーが表に定義されている。
- TRUNCATE TABLE
- 原則として、削除トリガーを活動化しない一括削除
- データ定義ステートメント
- 変更されたデータベース記述子全体をログに記録します。 非常に大きな DBD の場合、非常に大量のログ記録になる可能性があります。
- LOB または XML データを含む行の変更
- LOB または XML データを含む表のデータ。
プロシージャー
強力な SQL ステートメントによるログ・スペースの使用を制御するには、次のようにします。
- 一括削除操作の場合は、セグメント化(非UTS)表スペースまたはユニバーサル表スペースの使用を検討してください。 これらの表スペース・タイプがオプションではなく、表にトリガーが存在しない場合、または、アプリケーションが表に対するトリガーを安全に無視できる場合、表スペースごとに1つの表を作成し、TRUNCATEを使用することができます。
- 大量データの挿入の場合は、SQL INSERT ステートメントを使用する代わりに、LOG(NO) を指定した LOAD ユーティリティーを使用してインライン・コピーを取ってください。
- 更新の場合は、
表の列を定義するときに、ワークロードについて検討してください。
更新のためにログ記録されるデータの量は、
その行に含まれる列がすべて固定長かどうかによって異なります。 固定長で非圧縮の行の場合、変更は最初の更新された列の先頭から最後の更新された列の末尾までのみ記録されます。
したがって、頻繁に更新される列は、ログの量を減らすために、頻繁にクローズする必要があります。可変長の行 (可変長の行には、1 つ以上の可変長の列が含まれています) では、長さが変更されない場合は、最初に変更されたバイトから最後に更新された列の終わりまでのデータがログ記録されます。 ただし、長さが変更される場合 (これがより一般的です) は、最初に変更されたバイトから行の終わりまでのデータがログ記録されます。
ワークロードが読み取り集中型または更新集中型かを判別するには、
ログ・データ発生率を調べます。 発生率は、ログ統計の LOG RATE FOR 1 LOG (MB/SEC) フィールドにあります。 平均ログ・サイズを調べ、
それを 60 で割って、1 秒当たりに書き込まれるログのバイト数の平均を取得してください。
- 記録するログが秒当たり 2 MB 未満の場合、ワークロードは読み取り集中型です。
- 記録するログが秒当たり 20 MB を超える場合、ワークロードは更新集中型です。
- 毎秒2~20MBの処理量は、読み込みまたは更新のどちらかに集中しているわけではありません。
- 単一のデータベースのためのデータ定義ステートメント (CREATE、ALTER、
DROP) がたくさんある場合、
変更された DBD を各データ定義ステートメントごとにログ記録しないようにするために、
それらのデータ定義ステートメントを単一の作業単位内で出してください。
ただし、COMMIT が出されるまで DBD はロックされることに注意してください。
- 頻繁な更新が必要な LOB データまたは
XML データで、その代わりに LOB データまたは XML データをログからリカバリーできなくなるというトレードオフを受け入れられる場合には、NOT LOGGED オプションを使用してください。 (それでも、LOB 表スペースまたは XML 表スペースで RECOVER ユーティリティーを使用して、LOB 表スペースまたは XML 表スペースに物理的な整合性を持たせるための制御情報をリカバリーすることはできます。)
NOT LOGGEDとして定義されたLOBおよびXMLテーブルスペースは、 Db2 ログから回復できないため、そのデータについてはリカバリ計画を立てる必要があります。 例えば、バッチ更新を実行した場合は、
更新が完了した後で必ずイメージ・コピーを取るようにしてください。
- 年末処理など特定の期間を除いて頻繁に変更されないデータに対して、
データに短期間に頻繁な変更または大きな変更が発生した場合:
- データのイメージ・コピーを作成する。
- 表スペースを NOT LOGGED に変更します。
- 大量の変更を加えます。
- データを更新する他のアクティビティーを停止します。
- データのイメージ・コピーを作成する。
- 表スペースを LOGGED に変更します。
- マテリアライズ照会表など、伝搬データを含む表への変更では、
データが別の場所に存在するため、NOT LOGGED オプションを使用してください。
データが損傷を受けた場合、オリジナル・ソースから表全体をリフレッシュできます。