XML バージョン付け
単一 XML 文書の複数バージョンが、単一の XML 表で共存できます。 単一 XML 文書の複数バージョンが存在すると、ロックを回避することにより、並行性の向上につながる可能性があります。 さらに、ある場合では、 複数バージョンを持つことにより、文書内の以前の値をメモリーにコピーしないようにすることで、 実ストレージの節約になることがあります。
Db2 では、XML 列を含む表の基本表スペースがユニバーサル表スペースであり、表内の他のすべての XML 列が複数バージョンをサポートする場合、その XML 列にある XML 文書の複数バージョンをサポートします。
- XML 列を含む表からデータをアンロードします。
- 表をドロップします。
- ユニバーサル表スペースに表を作成します。 この新しい表は複数 XML バージョンをサポートします。
- データを表にロードします。
XML がバージョン付けされると、XML 文書を XML 列に挿入する際に、Db2 によって XML 文書にバージョン番号が割り当てられます。 XML 文書全体が更新されると、Db2 は文書の新規バージョンを XML 表に作成します。 XML 文書の一部が更新されると、Db2 は更新された部分の新規バージョンを作成します。 Db2 が XML バージョン付けを使用する場合、バージョン付けを使用しない場合よりデータ・セット・スペースを多く必要とします。 ただし、Db2 は、不要になったバージョンを定期的に削除します。 さらに、XML 文書を含む XML 表スペースに対して REORG ユーティリティーを実行して、不要なバージョンを削除できます。該当のバージョンを必要とする更新操作がコミットされる場合、かつ不要とされるバージョンを参照する読み取り元が存在しない場合に、Db2 は、文書のバージョンを除去します。
XML バージョン付けは、表スペースのバージョン付けや索引のバージョン付けとは異なります。 XML バージョン付けは、並行性とメモリー使用率の最適化を目的としています。 表スペースおよび索引のバージョン付けは、データの可用性を最大化することを 目的としています。
XML バージョン付けによる並行性向上の例: 次の例では、 同一のトランザクション内で同じ XML 文書が複数回変更される場合に、XML の複数バージョン によって並行性が向上される様子を示しています。
ユニバーサル表スペースにある表 T1 が次のように定義されているとします。
CREATE T1 (INT1 INT,
XML1 XML,
XML2 XML);
表には、以下のデータが含まれています。
INT1 | XML1 | XML2 |
---|---|---|
350 | <A1>111</A1> | <A2>aaa</A2> |
100 | <A1>111</A1> | <A2>aaa</A2> |
250 | <A1>111</A1> | <A2>aaa</A2> |
アプリケーションが、次の疑似コードによって表される SQL 読み取り操作を 実行します。
EXEC SQL
DECLARE CURSOR C1 FOR
SELECT INT1, XML1
FROM T1
ORDER BY INT1
FOR READ ONLY;
同時に、別のアプリケーションが、次の疑似コードによって表される SQL 書き込み操作 を実行します。
EXEC SQL UPDATE T1
SET XML1 = XMLPARSE(DOCUMENT '<B1>222</B1>');
EXEC SQL OPEN CURSOR C1;
EXEC SQL UPDATE T1
SET XML1 = XMLPARSE(DOCUMENT '<C1>333</C1>');
EXEC SQL FETCH FROM C1 INTO :HVINT1, :HVXML1;
複数バージョン付けを使用すると、読み取りアプリケーションは ロックを保持する必要がないため、更新アプリケーションは読み取りアプリケーション の終了を待たずに更新操作を実行できます。 読み取りアプリケーションは、 一貫性のあるデータである、以前のバージョンの XML 値を 読み取ります。
XML バージョン付けによるストレージ使用率の向上の例: 次の例では、 XML 文書が自己参照更新操作の対象である場合に、複数の XML バージョンによって 実ストレージの使用量が削減される様子を示しています。
ユニバーサル表スペースにある表 T1 が次のように定義されているとします。
CREATE T1 (INT1 INT,
XML1 XML,
XML2 XML);
表には、以下のデータが含まれています。
INT1 | XML1 | XML2 |
---|---|---|
350 | <A1>111</A1> | <A2>aaa</A2> |
100 | <A1>111</A1> | <A2>aaa</A2> |
250 | <A1>111</A1> | <A2>aaa</A2> |
アプリケーションが、次の疑似コードによって表される SQL 操作を 実行します。
EXEC SQL
UPDATE T2
SET XML1 = XML2, 1
XML2 = XML1 2
WHERE INT1 = 100;
EXEC SQL
COMMIT 3 ;
これらの操作の結果は、以下のとおりです。
- 列 XML1 が更新されると、Db2 は、列 XML1 に対し、更新された文書を新規バージョンとして XML 表に保管します。 これで、列 XML1 の第 2 行については、XML 文書が 2 バージョンになりました。
First version: <A1>111</A1> Second version: <A2>aaa</A2>
- 列 XML2 が更新されると、Db2 は、列 XML2 に対し、更新された文書を新規バージョンとして XML 表に保管します。 これで、列 XML2 の第 2 行については、各 XML 文書が 2 バージョンになりました。
First version: <A2>aaa</A2> Second version: <A1>111</A1>
- 更新操作がコミットされると古いバージョンは不要になります。Db2 は、列 XML1 および XML2 に対して、XML 表からそれらのバージョンを削除します。
複数 XML バージョンなしの場合、Db2 は更新された文書の元のバージョンをメモリーにコピーして、それらの値が失われないようにする必要があります。 大きい XML 文書の場合は、ストレージ不足に なる可能性があります。