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

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

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

    tbwshc

    詳解DB2中自定義XML存儲及其使用環(huán)境

    使用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文檔與應用程序的業(yè)務邏輯對象和主要的訪問粒度匹配。

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

     

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

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

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

    這種輕松添加和移除訂單條目的功能在DB2 9 for z/OS中尤其有價值,因為這個版本不支持在現(xiàn)有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函數(shù),這個函數(shù)從輸入XML文檔抽取插入items表中的值,它將會拆分輸入XML文檔,生成獨立條目的文檔。XMLTABLE函數(shù)包括一個參數(shù),通過它,應用程序可以傳遞一個訂單文檔,使用XPath表達式$d/order/item,XMLTABLE函數(shù)為輸入文檔的每一個條目生成一行數(shù)據(jù),然后抽取訂單ID,客戶ID和訂單日期,特殊的列定義FOR ORDINALITY為產生的每一行打上編號。XMLDOCUMENT函數(shù)確保每一個條目片段可以作為一個獨立的XML文檔插入。

    上面的代碼顯示了使用INSERT語句插入XML文檔后items表中的數(shù)據(jù),下面的代碼顯示了如何重建原始的訂單文檔,XMLELEMENT和XMLATTRIBUTES函數(shù)使用items表中相關列的值構建的頂部文檔,XMLAGG函數(shù)組合所有條目,最后形成一個完整的訂單文檔。注意,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特性允許你與數(shù)據(jù)庫分區(qū)功能(Database Partitioning Feature,DPF),范圍分區(qū)表和多維集群(MDC)表一起使用XML列,但分區(qū)或集群鍵必須由相關的列組成。前面你已經看到了如何使用INSERT和XMLTABLE從XML文檔抽取值到相關的列中,你可以使用這些關聯(lián)列對表進行分區(qū)或集群。如果你更喜歡在程序中使用簡單的INSERT語句,并且不知道如何抽取數(shù)據(jù)時,那你可以考慮使用一個生成的列。

    DB2 9.7在用戶定義函數(shù)(UDF)中支持XML參數(shù),允許你定義生成的列,使用插入的XML文檔中的值自動填充。下面的代碼顯示了一個UDF,它接受一個XML文檔作為輸入,如前面例子中的訂單文檔,這個UDF使用XMLCAST和XMLQUERY函數(shù)抽取輸入文檔的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列存儲訂單的表,并自動抽取訂單日期填充到關聯(lián)的列(odate)中。一條INSERT語句現(xiàn)在可以簡單地插入一個XML文檔到order列中,不需要考慮抽取值到關聯(lián)列中:

    1. CREATE TABLE orders(  
    2.   order XML,  
    3.   odate DATE GENERATED ALWAYS AS (extractDate(order))); 

    如果你連續(xù)不斷地存儲許多訂單,可能需要對舊訂單進行歸檔,這個時候使用范圍分區(qū)是最好的選擇,下面的代碼顯示了表order2是通過按odate列的值進行分區(qū)的,odate列則產生自XML列,同樣,你可以使用生成的列作為分區(qū)數(shù)據(jù)庫的分配鍵,也可以作為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數(shù)據(jù)變得更加容易和高效,使用UDF定義生成列可以簡化XML值抽取到關聯(lián)列,使用生成列還可以幫助你管理分區(qū)數(shù)據(jù)庫,范圍分區(qū)表,或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)  編輯  收藏


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


    網站導航:
     
    主站蜘蛛池模板: 成人五级毛片免费播放| 精品久久久久久久久免费影院| 国产嫩草影院精品免费网址| 亚洲人成色777777精品| 日韩精品视频免费观看| 亚洲精品无码少妇30P| 国产成人免费永久播放视频平台 | 国产高清免费观看| 色噜噜噜噜亚洲第一| 国产一区二区三区免费视频| 最近免费中文字幕MV在线视频3| 久久亚洲国产精品五月天婷| 国产免费网站看v片在线| 久久综合亚洲色HEZYO社区| 亚洲国产精品网站在线播放| 国产免费怕怕免费视频观看| 菠萝菠萝蜜在线免费视频| 亚洲欧洲国产成人综合在线观看 | 亚洲尤码不卡AV麻豆| 国产精品偷伦视频观看免费| 久久精品国产亚洲av水果派| 99久久99这里只有免费费精品| 亚洲熟妇无码八V在线播放| 亚洲av午夜精品一区二区三区 | 成人午夜亚洲精品无码网站| 免费一级毛片无毒不卡| 精品亚洲AV无码一区二区三区| 最新69国产成人精品免费视频动漫| 看Aⅴ免费毛片手机播放| 国产精品亚洲片在线观看不卡| 100部毛片免费全部播放完整| 男人的天堂av亚洲一区2区| 国产亚洲精品免费视频播放| 59pao成国产成视频永久免费| 亚洲狠狠色丁香婷婷综合| 伊伊人成亚洲综合人网7777| 91九色老熟女免费资源站| 日韩在线观看免费完整版视频| 免费看无码自慰一区二区| 香蕉免费看一区二区三区| 亚洲国产成人99精品激情在线|