IBM Support

[Db2] LOB の挿入や更新が遅い原因と対処方法

Question & Answer


Question

LOB データを含むテーブルへのデータの挿入/更新処理に時間がかかります。原因を教えてください。

Cause

LOB データが格納される領域は、buddy space と呼ばれる領域で構成されており、buddy space は複数の buddy segment に分かれています。この buddy space に存在している空き領域の情報を持っているのが LOBA (LOB Allocation) ページです。LOB オブジェクトの一定サイズごとに LOBA が存在しているため、LOB オブジェクトのサイズが大きくなれば、それだけ LOBA ページの数も増加します。

LOB データを挿入する際、Db2 は LOBA から空き領域の情報を読み取り、スペース要求を満たす未使用の buddy segment を探索します。LOB データの更新処理はすべて DELETE + INSERT に変換されるため、更新処理でも同様に空き領域の探索が発生します。

このとき、以下のいずれかの条件に合致すると、空き領域の探索に時間がかかり、結果としてデータの挿入/更新処理に時間がかかる場合があります。
  1. 既存の buddy space がいっぱいで、検索しても空き領域が見つからない場合
  2. 未コミット・トランザクションが長期間残っている場合
  3. LOBA のサイズが大きい場合

Answer

上記 a - c の条件に合致すると、以下のような理由で処理時間が長くなります。
  1. 既存の buddy space がいっぱいで、探索しても空き領域が見つからない場合、buddy space が追加されます。このケースでは、buddy space が追加される前に、一度既存の buddy space をすべて探索するため、パフォーマンスが低下します。解決策は、あらかじめ LOB のダミーデータを挿入/削除しておき、buddy space を広げておくことです。
  2. LOB データが削除された場合、削除後の buddy segment は再利用されます。しかし、該当の LOB を持つ表に対して以下のいずれかが存在すると、削除ペンディングの buddy segment は再利用できません。
    • 該当表に対する照会
    • 該当表への参照を含む未コミット・トランザクション
    • 該当表への WITH HOLD カーソル
  3. buddy segment を効率的に再利用し、LOB データの挿入と更新のパフォーマンスを適切に保つには、以下の点を考慮してください。
    • 該当表を参照するトランザクションを適切なタイミングでコミットする
    • WITH HOLD カーソルの使用を減らす。または適切に close する
    • LOB をインライン化できる場合は、インライン化する
  4. 空き領域の探索はシーケンシャルに実行されます。LOB データの挿入/削除処理が完了すると、Db2 は次回以降の空き領域の探索を開始する位置を示す、ヒントとなる情報を更新するため、そのヒントの情報を元に開始位置を決定し、以降の LOBA を、スペース要求を満たす buddy segment が見つかるまで探索し続けます。この探索の際、LOBA はバッファー・プールに読み込まれます。

    LOBA のサイズが大きく、多くの LOBA を探索する必要がある場合には、それだけ空き領域の探索にも時間がかかります。特に、バッファー・プールのサイズが小さい場合などには、LOBA の読み取りの際に物理読み取りが発生するため、非常に時間がかかる場合があります。解決策は、ひとつのテーブルに格納されている LOB データのサイズを小さくするためにテーブルを分けること、物理読み取りが発生しないよう、バッファー・プールのサイズを大きくすることなどが挙げられます。

    表を作成するときに LONG IN で LOB 用の表スペースを指定した場合、LOB および LOBA ページは LOB 用表スペースに格納されます。このため、LOBA 用のバッファープールは LOB 用表スペースに関連付けられたものを使用します。


関連情報
Simultaneous inserts, updates, deletes and or reads of a table that contains LOBs might have performance impacts due to lengthy LOB free space searches
 
お問合せ先
技術的な内容に関して、パスポート・アドバンテージの契約のもと Db2 テクニカル・サポートへお問い合わせください。
Db2 テクニカル・サポート

[{"Type":"MASTER","Line of Business":{"code":"LOB10","label":"Data and AI"},"Business Unit":{"code":"BU058","label":"IBM Infrastructure w\/TPS"},"Product":{"code":"SSEPGG","label":"Db2 for Linux, UNIX and Windows"},"ARM Category":[{"code":"a8m500000008PlWAAU","label":"Database Objects-\u003ELOBS"},{"code":"a8m500000008PkqAAE","label":"Performance"}],"ARM Case Number":"","Platform":[{"code":"PF025","label":"Platform Independent"}],"Version":"All Versions"}]

Document Information

Modified date:
27 August 2023

UID

swg21982163