DB2 テーブル・オーバーフロー・サポート: 照会の影響
DB2® for Linux, UNIX and Windows バージョン 10.1 以前および DB2 for z/OS® では、テーブルの行サイズの制限は 32 KB です。オブジェクト・ストア・データベース用に、生成された列の索引を作成するときに、列の長さの制限を超過することがあります。この場合はエラーになります。32 KB の行サイズ制限に対処するために、Content Platform Engine は、オブジェクト・ストアで有効にすることができるテーブル・オーバーフロー・サポート機能を提供します。これにより、基本の DB2 テーブルの 32 KB の行サイズ制限を超過した場合に、オーバーフロー・テーブルが作成されます。この機能は、テーブル内の新規の列の長さと既存の列の長さの合計が 32 KB (オーバーヘッドを減算する) を超えたとき、新規クラス・プロパティーの列をオーバーフロー・テーブルに追加します。

UPDATE DATABASE CONFIGURATION FOR dbName USING EXTENDED_ROW_SZ ENABLE

テーブル・オーバーフロー・サポートが使用可能になっている場合、特定の条件では DB2 データベースに対する照会は失敗します。以下のセクションでは、それらの条件を明記し、起こりうる障害を回避する方法を説明します。
オーバーフロー・サポート用の照会実装
検索およびオブジェクト取得中に、DocVersion などの基本表を、そのオーバーフロー・テーブルに結合することにより、すべての必要な列がデータベース照会で返されます。例えば、SELECT … FROM Document という検索は、DocVersion テーブルを以下の式のようなオーバーフロー・テーブル結合式に置き換える FROM 節を使用して実装されます。
FROM (SELECT … FROM DocVersion LEFT JOIN S1_DocVersion …) TO
S1_DocVersion はオーバーフロー・テーブルであり、オーバーフロー・テーブルに格納されているプロパティーが SELECT リスト、WHERE 条件、または ORDER BY プロパティーに含まれている場合のみ、FROM 節結合式に含まれます。T0 は、結合式の別名です (ネストされたテーブルとも呼ばれます)。
DB2 照会の問題
DB2 for Linux, UNIX and Windows バージョン 10.1 以前および DB2 for z/OS には、保管できる行の長さが 32 KB までという制限があり、この制限は照会の処理で使用される DB2 システム一時テーブルにも適用されます。先にデータの一部を処理してからクライアントに行を返す必要のある、結合などの複雑な照会には、一時作業テーブルが必要です。作業テーブルはメモリーに格納されますが、サイズが大きすぎる場合は、システムの一時テーブル領域に格納されます。
作業テーブルの作成で DB2 コンパイラーが使用する列の長さの合計が 32 KB を超える場合、次の障害が発生します。
SQL1585N 十分なページ・サイズを持つ SYSTEM TEMPORARY 表スペースが存在しません。SQLSTATE=54048
このページ・サイズ・エラーは、照会内の複数の個別のテーブルからの列 (それぞれ 32 KB 未満) を一時作業テーブルで連結したときに発生します。
障害の例
作業テーブル・ページ・サイズ・エラーは、以下の条件が存在するときにアドホック検索で生成されます。
- 検索に、オーバーフロー・テーブルからのプロパティーが含まれている。
- 検索で、結合された列プロパティーの長さが 32 KB を超えるものをテーブルから選択している。
- 1 つのオーバーフローしたテーブルは、左または右の自己結合か、別のテーブルとの右結合に参加し、複数のオーバーフロー・テーブルは、自己内部結合に参加する。
これらの条件は、IBM® においてテスト済みです。行の長さの制限を超える大きさの作業テーブルを DB2 システムが使用する (これにより作業テーブル・ページ・サイズ・エラーが発生する) きっかけとなる、テストされていない条件がほかに存在する可能性があるため、注意してください。
以下の 2 つの例では、選択リストに 32 KB を超える列が含まれています。
例 1 - 複数のオーバーフロー・テーブルとの自己結合
SELECT … FROM Document D INNER JOIN Document E on D.property1 = E.property2
結果として以下のようにデータベース SQL が生成されます。
SELECT … FROM (select … from Docversion d1 left join S1_Docversion d2 on d1.object_id = d2.object_id1 left join S2_Docversion d3 on d1.object_id = d3.object_id2) T0 INNER JOIN (select … from Docversion d1 left join S1_Docversion d2 on d1.object_id = d2.object_id1 left join S2_Docversion d3 on d1.object_id = d3.object_id2) T1 ON T0.property1 = T1.property2
例 2 - 1 つのオーバーフロー・テーブルとの右結合
SELECT … FROM Document D RIGHT OUTER JOIN CustomObject E on D.property1 = E.property2
結果として以下のようにデータベース SQL が生成されます。
SELECT … FROM (select … from Docversion d1 left join S1_Docversion d2 on d1.object_id = d2.object_id1) T0 RIGHT OUTER JOIN Generic T1 on T0.property1 = T1.property2
作業テーブル・ページ・サイズ・エラーの回避
DB2 for Linux, UNIX and Windows バージョン 10.1 以前で DB2 テーブル・オーバーフロー・サポートが使用可能になっている場合、照会で SELECT 列を慎重に選択することによって、起こりうる作業テーブル・ページ・サイズ・エラーを回避できます。前のセクションの例 1 では、2 番目の自己結合テーブルから列を選択しないことによって、エラーを回避できます。同様に例 2 では、32 KB を超える列を選択しないことによって、エラーが回避されます。