DB 2におけるカスタムXMLメモリとその使用環境について詳細に説明する.

14588 ワード

DB 2におけるカスタムXMLメモリとその使用環境について詳細に説明する.
IBM DB 2 for z/OSとDB 2 for Linux、UNIXとWindows(LUW)を使うなら大丈夫ですが、いつXMLメモリを使うか、どのようにXMLメモリをカスタマイズするかを振り返ってみましょう.
イメージを説明するために、XMLドキュメントを使用します.内容は以下の通りです.

  
  
  
  
  1. <order OrderID="9001" OrderDate="2009-10-18">> 
  2.  <customerID>26914</customerID> 
  3.  <item id="LK-486"> 
  4.   <name>Magictb Potion</name> 
  5.   <size>300ml</size> 
  6.   <price>19.99</price> 
  7.  </item> 
  8.  <item id="VF-145"> 
  9.   <name>Crystal Ball, Deluxe</name> 
  10.   <color>crystal clear</color> 
  11.   <price>295.00</price> 
  12.  </item> 
  13. </order> 
これは注文ID、日付、顧客IDと他の項目を含む注文XML文書を示しています.一部の項目の説明方法はsizeとカラーのように違っています.私たちはDB 2でこのようなXML文書をたくさん管理する必要があると仮定します.
どのようにXMLを分割して再構築しますか?
別の記事「15個のDB 2 pureXML性能の最適実践」では、あなたが賢明にドキュメントの粒度を選択するべきだと述べましたが、実際にはDB 2に記憶されているXMLドキュメントとアプリケーションのビジネスロジックオブジェクトと主要なアクセス粒度が一致します.
私達の例では、注文の変化が非常に頻繁であると仮定して、注文書内の項目の読み込み、追加または削除は最も重要な操作であり、最適な性能が必要である.この場合、注文書を分割して、各項目をDB 2テーブルの各ラインに独立した文書として保存することを考慮しても良い.(注文書を完全に保存する従来の方法と比較して)の利点は、保存されたデータを操作しやすく、より高速にすることです.
 
単一の行を使って検索項目を読み取ることができます.完全な注文文書から項目を抽出する必要はありません.
表の行を削除することで、注文書から項目を簡単に削除できます.完全な注文文書を操作する必要がなくなります.
新しい項目を注文書に素早く挿入することができます.注文書の完全な操作が必要ではありません.
このような注文項目を簡単に追加して削除する機能は、DB 2 for z/OSに特に価値があります.このバージョンは既存のXMLドキュメントに要素を追加または削除することをサポートしていません.次のコードはテーブルの定義を示しています.また、注文書のINSERT文を分割して、それぞれ注文ID、クライアントID、注文日と項目の流れ番号を格納しています.

  
  
  
  
  1. CREATE TABLE items(ordID INTEGER, custID INTEGER,  
  2.                                    odate DATE, seqNo INTEGER, item XML);  
  3. INSERT INTO items(ordID, custID, odate, seqno, item)  
  4.  SELECT T.ordID, T.custID, T.odate, T.seqno, XMLDOCUMENT( T.item)  
  5.  FROM 
  6.   XMLTABLE('$d/order/item' PASSING cast(? AS XML) "d" 
  7.    COLUMNS  
  8.     ordID        INTEGER    PATH      '../@OrderID',  
  9.     custID       INTEGER    PATH      '../customerID' 
  10.     odate        DATE       PATH      '../@OrderDate',  
  11.     seqNo        FOR ORDINALITY,  
  12.     item         XML        PATH      '.'AS T; 
項目情報はXML形式で保存されています.項目には異なる要素と属性があります.
 

  
  
  
  
  1. ORDID     CUSTID     ODATE     SEQNO     ITEM  
  2. -----     -----     ------     -----     -----  
  3. 9001     26914     10/18/2009     1   <item id="LK-486">  
  4.                                         <name>Magic Potion</name>  
  5.                                         <size>300ml</size>  
  6.                                         <price>19.99</price>  
  7.                                       </item>  
  8. 9001     26914     10/18/2009     2   <item id="VF-145">  
  9.                                         <name>Crystal Ball, Deluxe</name>  
  10.                                         <color>crystaltb clear</color>  
  11.                                         <price>295.00</price>  
  12.                                       </item>  
  13. 2 record(s) selected. 
INSERT文にはXMLtABLE関数が含まれています.この関数は入力XMLドキュメントからitemsテーブルに挿入された値を抽出します.XMLドキュメントを分割して入力し、独立した項目のドキュメントを生成します.XMLtABLE関数にはパラメータが含まれています.これによって、ドキュメントの注文が伝達されます.XXTAh表現を使用して、XTART/order/item、XMLtABLE関数は入力ドキュメントの各項目ごとに生成されます.行のデータを抽出し、注文ID、クライアントID、注文日を抽出します.特別な列はFOR ORDINALITYを定義します.作成した行ごとに番号を付けます.XMLDOCUMENT関数は、各項目のセグメントが独立したXMLドキュメントとして挿入できることを保証します.
上のコードはINSERT文を使ってXMLドキュメントに挿入した後、itemsテーブルのデータを示しています.下のコードは元の注文文書をどう再構築するかを示しています.XMLEMENTとXMLATTRIBTES関数はitemsテーブルの関連列の値を使って構築した上部文書を使って、XMLAGG関数はすべての項目を組み合わせて、最後に完全な注文文書を形成します.ORDER BYサブフレーズを選択してください.これにより、元のドキュメントの項目表示順序とは、復元後の注文文書と一致することができます.
 

  
  
  
  
  1. SELECT XMLELEMENT(name "order",  
  2.          XMLATTRIBUTES(ordID AS "OrderID", odate as "OrderDate"),  
  3.          XMLELEMENT(name "customerID", custID)  
  4.          XMLAGG(item ORDER BY seqno) )  
  5. FROM items  
  6. WHERE ordID = 9001  
  7. GROUP BY ordID, odate, custID; 
生成列を使う
DB 2 9.7 for LUWにおける新たなIBM DB 2 pureXML特性により、データベースパーティション機能(Database Partioning Feature、DPF)、範囲パーティションテーブル、およびマルチ次元クラスタ(MDC)との間の機能が可能になります.テーブルはXML列を使用していますが、パーティションやクラスタキーは関連する列で構成されていなければなりません.前にはINSERTとXMLtABLEを使ってXMLドキュメントから関連する列に値を抽出する方法が見られました.これらの関連列を使ってテーブルをパーティションやクラスタ化してもいいです.手順で簡単なINSERT文を使うのが好きなら、データを抽出する方法が分かりません.生成された列を使用します.
DB 2 9.7はユーザー定義関数(UDF)でXMLパラメータをサポートしています.生成した列を定義し、挿入したXMLドキュメントの値を使って自動的に塗りつぶします.次のコードはUDFを示しています.XMLドキュメントを入力として受け入れます.このUDFはXMLCASTとXMLQULRY関数を使って入力ドキュメントのOrderDate属性を抽出します.
 

  
  
  
  
  1. CREATE FUNCTION extractDate(doc XML)  
  2.   RETURNS DATE 
  3.   LANGUAGE SQL CONTAINS SQL  
  4.   NO EXTERNAL ACTION DETERMINISTIC  
  5.   RETURN XMLCAST(XMLQUERY('$d/order/@OrderDate' 
  6.          PASSING doc AS "d"AS DATE); 
SELECTクエリや他のSQL文でこのUDFを使用することができますが、次の例では、完全な注文を検索して挿入することが最も重要な操作であると仮定して、注文書を完全に保存することが最善の選択です.下記のコードはXML列を使用して注文書を保存するテーブルを定義し、自動的に注文日を抽出して充填します.関連する列(odate)に挿入します.一つのINSERT文は現在簡単に一つのXML文書をorder列に挿入できます.抽出値を関連する列に考慮する必要はありません.

  
  
  
  
  1. CREATE TABLE orders(  
  2.   order XML,  
  3.   odate DATE GENERATED ALWAYS AS (extractDate(order))); 
多くの注文を連続的に保存すると、古い注文書を保存する必要があります.この時に使用する範囲のパーティションが一番良い選択です.下のコードはテーブルorder 2がodate列の値を押すことによってパーティションを行います.odate列はXML列から生成されます.同様に、生成した列をパーティションデータベースの割り当てキーとして使用してもいいです.MDCテーブルのクラスタキーとしてもいいです.

  
  
  
  
  1. CREATE TABLE order2(  
  2.   order XML,  
  3.   odate DATE GENERATED ALWAYS AS (extractDate(order)) NOT NULL)  
  4.  PARTITION BY RANGE (odate)  
  5.  (PART q109 STARTING('01-01-2009') ENDING ('03-31-2009') INCLUSIVE,  
  6.  PART q209 ENDING ('06-30-2009') INCLUSIVE,  
  7.  PART q309 ENDING ('09-30-2009') INCLUSIVE,  
  8.  PART q409 ENDING ('12-31-2009') INCLUSIVE); 
制御XMLメモリ
 
カスタムXML記憶には多くの利点があります.大規模XMLドキュメントを複数の小文書に分割すると、操作XMLデータがより容易かつ効率的になります.UDF定義生成列を使用すると、XML値を簡易化して関連列に抽出することができます.生成列を使用すると、パーティションデータベース、範囲パーティションテーブル、またはMDCテーブルのXMLを管理するのにも役立ちます.
原文の出所:http://www.ibm.com/developerworks/data/library/dmmag/DMMag_2009_Issue3/Tips/index.html
Custoomizing XML storge in DB 2
作者:Matthias Nicola