XML バージョン付け

単一 XML 文書の複数バージョンが、単一の XML 表で共存できます。 単一 XML 文書の複数バージョンが存在すると、ロックを回避することにより、並行性の向上につながる可能性があります。 さらに、ある場合では、 複数バージョンを持つことにより、文書内の以前の値をメモリーにコピーしないようにすることで、 実ストレージの節約になることがあります。

Db2 では、XML 列を含む表の基本表スペースがユニバーサル表スペースであり、表内の他のすべての XML 列が複数バージョンをサポートする場合、その XML 列にある XML 文書の複数バージョンをサポートします。

XML 表が、複数 XML バージョンをサポートしない場合は、以下の手順に従って、複数 XML バージョンをサポートする表にその表を変換できます。
  1. XML 列を含む表からデータをアンロードします。
  2. 表をドロップします。
  3. ユニバーサル表スペースに表を作成します。 この新しい表は複数 XML バージョンをサポートします。
  4. データを表にロードします。

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 ;

これらの操作の結果は、以下のとおりです。

  1. 列 XML1 が更新されると、Db2 は、列 XML1 に対し、更新された文書を新規バージョンとして XML 表に保管します。 これで、列 XML1 の第 2 行については、XML 文書が 2 バージョンになりました。
    First version:  <A1>111</A1>
    Second version: <A2>aaa</A2>
  2. 列 XML2 が更新されると、Db2 は、列 XML2 に対し、更新された文書を新規バージョンとして XML 表に保管します。 これで、列 XML2 の第 2 行については、各 XML 文書が 2 バージョンになりました。
    First version:  <A2>aaa</A2>
    Second version: <A1>111</A1>
    
  3. 更新操作がコミットされると古いバージョンは不要になります。Db2 は、列 XML1 および XML2 に対して、XML 表からそれらのバージョンを削除します。

複数 XML バージョンなしの場合、Db2 は更新された文書の元のバージョンをメモリーにコピーして、それらの値が失われないようにする必要があります。 大きい XML 文書の場合は、ストレージ不足に なる可能性があります。