<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    tbwshc

    詳解DB2中自定義XML存儲及其使用環境

    使用IBM DB2 for z/OS和DB2 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和color。我們假設需要在DB2中管理許多與此類似的XML文檔。

    如何拆分和重組XML

    我在另一篇文章“15個DB2 pureXML性能最佳實踐”中談到了你應該明智地選擇文檔的粒度,實際上就是要將存儲在DB2中的XML文檔與應用程序的業務邏輯對象和主要的訪問粒度匹配。

    在我們的例子中,假設訂單變化非常頻繁,訂單內的條目讀取,添加或刪除是最關鍵的操作,需要最佳的性能,在這種情況下,你可以考慮將訂單文檔拆分,將每一個條目作為一個獨立的文檔存儲到DB2表的每一行中,這個存儲方法(與原來的完整存儲訂單文檔的方法相比)的好處是它使得操作所存儲的數據更容易,更快速:

     

    可以使用單行讀取檢索一個條目,不用從一個完整的訂單文檔中抽取條目了;

    可以通過刪除表中的行簡單地從訂單中刪除一個條目,不再需要操作完整的訂單文檔;

    可以迅速插入一個新條目到訂單中,這時也不需要操作完整的訂單文檔。

    這種輕松添加和移除訂單條目的功能在DB2 9 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函數包括一個參數,通過它,應用程序可以傳遞一個訂單文檔,使用XPath表達式$d/order/item,XMLTABLE函數為輸入文檔的每一個條目生成一行數據,然后抽取訂單ID,客戶ID和訂單日期,特殊的列定義FOR ORDINALITY為產生的每一行打上編號。XMLDOCUMENT函數確保每一個條目片段可以作為一個獨立的XML文檔插入。

    上面的代碼顯示了使用INSERT語句插入XML文檔后items表中的數據,下面的代碼顯示了如何重建原始的訂單文檔,XMLELEMENT和XMLATTRIBUTES函數使用items表中相關列的值構建的頂部文檔,XMLAGG函數組合所有條目,最后形成一個完整的訂單文檔。注意,XMLAGG在seqno列上包括一個可選的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; 

    使用生成列

    DB2 9.7 for LUW中新的IBM DB2 pureXML特性允許你與數據庫分區功能(Database Partitioning Feature,DPF),范圍分區表和多維集群(MDC)表一起使用XML列,但分區或集群鍵必須由相關的列組成。前面你已經看到了如何使用INSERT和XMLTABLE從XML文檔抽取值到相關的列中,你可以使用這些關聯列對表進行分區或集群。如果你更喜歡在程序中使用簡單的INSERT語句,并且不知道如何抽取數據時,那你可以考慮使用一個生成的列。

    DB2 9.7在用戶定義函數(UDF)中支持XML參數,允許你定義生成的列,使用插入的XML文檔中的值自動填充。下面的代碼顯示了一個UDF,它接受一個XML文檔作為輸入,如前面例子中的訂單文檔,這個UDF使用XMLCAST和XMLQUERY函數抽取輸入文檔的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))); 

    如果你連續不斷地存儲許多訂單,可能需要對舊訂單進行歸檔,這個時候使用范圍分區是最好的選擇,下面的代碼顯示了表order2是通過按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

    原文名:Customizing XML storage in DB2

    作者:Matthias Nicola

     

    posted on 2012-08-31 08:08 chen11-1 閱讀(1864) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 国产又大又长又粗又硬的免费视频 | a在线视频免费观看| 亚洲国产AV无码专区亚洲AV| 日本片免费观看一区二区| 色婷婷六月亚洲综合香蕉| 亚洲AV无码一区二区二三区软件| 黄页网站免费观看| 一区二区三区免费高清视频| 亚洲综合一区二区国产精品| 国产免费小视频在线观看| 性xxxx视频免费播放直播| 亚洲国产精华液2020| 亚洲爆乳无码专区| 国产成人高清精品免费鸭子| 久久青草免费91观看| 老司机福利在线免费观看| 亚洲美女视频一区二区三区| 亚洲狠狠爱综合影院婷婷| 国产情侣激情在线视频免费看| www免费插插视频| 中文字幕乱码亚洲精品一区| 亚洲va久久久噜噜噜久久| 免费a级毛片网站| 免费看黄视频网站| 中文字幕免费在线看| 亚洲AV电影天堂男人的天堂| 亚洲综合久久综合激情久久| 亚洲男人av香蕉爽爽爽爽| 夫妻免费无码V看片| 91青青国产在线观看免费| 国产精品免费αv视频| 亚洲男同gay片| 亚洲国产成人久久77| 亚洲av午夜成人片精品网站| 亚洲AV无码一区二区三区国产| AA免费观看的1000部电影| 七色永久性tv网站免费看| 一区二区三区免费视频观看| 亚洲国产成人久久精品软件 | 德国女人一级毛片免费| 最近中文字幕mv免费高清在线|