db2 自定义java_详解DB2中自定义XML存储及其使用环境

本文探讨了在DB2环境中如何有效地管理和存储XML数据。通过将大型XML文档拆分为多个小文档,可以提高操作效率。文章还介绍了如何使用自定义列和UDF(用户定义函数)来自动抽取XML值,以及如何利用这些技术实现范围分区,以优化数据存储和查询性能。此外,通过示例展示了如何插入和重构XML文档,以及如何利用XMLTABLE和XMLAGG函数进行数据处理。
摘要由CSDN通过智能技术生成

使用IBM DB2 for z/OS和DB2 for Linux,UNIX和Windows (LUW),那就没有问题,下面让我们一起回顾一下什么时候使用XML存储,以及如何自定义XML存储的一些最佳实践吧!

为了形象地说明,我将使用一个XML文档,内容如下:>

26914

Magictb Potion

300ml

19.99

Crystal Ball, Deluxe

crystal clear

295.00

它展示了一个包括订单ID,日期,客户ID和其它条目的订单XML文档,注意有些条目的描述方式有所不同,如size和color。我们假设需要在DB2中管理许多与此类似的XML文档。

如何拆分和重组XML

我在另一篇文章“15个DB2 pureXML性能最佳实践”中谈到了你应该明智地选择文档的粒度,实际上就是要将存储在DB2中的XML文档与应用程序的业务逻辑对象和主要的访问粒度匹配。

在我们的例子中,假设订单变化非常频繁,订单内的条目读取,添加或删除是最关键的操作,需要最佳的性能,在这种情况下,你可以考虑将订单文档拆分,将每一个条目作为一个独立的文档存储到DB2表的每一行中,这个存储方法(与原来的完整存储订单文档的方法相比)的好处是它使得操作所存储的数据更容易,更快速:

可以使用单行读取检索一个条目,不用从一个完整的订单文档中抽取条目了;

可以通过删除表中的行简单地从订单中删除一个条目,不再需要操作完整的订单文档;

可以迅速插入一个新条目到订单中,这时也不需要操作完整的订单文档。

这种轻松添加和移除订单条目的功能在DB2 9 for z/OS中尤其有价值,因为这个版本不支持在现有XML文档中添加或删除元素。

下面的代码显示了一个表的定义,以及拆分一个订单文档的INSERT语句,相关的列分别存储订单ID,客户ID,订单日期和一个条目流水号。CREATETABLEitems(ordIDINTEGER, custIDINTEGER,

odateDATE, seqNoINTEGER, item XML);

INSERTINTOitems(ordID, custID, odate, seqno, item)

SELECTT.ordID, T.custID, T.odate, T.seqno, XMLDOCUMENT( T.item)

FROM

XMLTABLE('$d/order/item'PASSINGcast(?ASXML)"d"

COLUMNS

ordIDINTEGERPATH'../@OrderID',

custIDINTEGERPATH'../customerID'

odateDATEPATH'../@OrderDate',

seqNoFORORDINALITY,

item         XML        PATH'.')AST;

条目信息是以XML格式存储的,因为条目可能有不同的元素和属性,如:

ORDID     CUSTID     ODATE     SEQNO     ITEM

-----     -----     ------     -----     -----

9001     26914     10/18/2009     1   

Magic Potion

300ml

19.99

9001     26914     10/18/2009     2   

Crystal Ball, Deluxe

crystaltb clear

295.00

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子句,这样可以确保还原后的订单文档和原始文档中的条目显示顺序是一致的。

SELECTXMLELEMENT(name"order",

XMLATTRIBUTES(ordIDAS"OrderID", odateas"OrderDate"),

XMLELEMENT(name"customerID", custID)

XMLAGG(itemORDERBYseqno) )

FROMitems

WHEREordID = 9001

GROUPBYordID, 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属性:

CREATEFUNCTIONextractDate(doc XML)

RETURNSDATE

LANGUAGE SQLCONTAINSSQL

NOEXTERNALACTIONDETERMINISTIC

RETURNXMLCAST(XMLQUERY('$d/order/@OrderDate'

PASSING docAS"d")ASDATE);

你可以在SELECT查询和其它SQL语句中使用这个UDF,但也要定义一个生成列,对于下面的示例,假设检索和插入完整的订单是最关键的操作,在这种情况下,完整地存储订单文档是最好的选择。下面的代码定义了一个使用XML列存储订单的表,并自动抽取订单日期填充到关联的列(odate)中。一条INSERT语句现在可以简单地插入一个XML文档到order列中,不需要考虑抽取值到关联列中:CREATETABLEorders(

orderXML,

odateDATEGENERATED ALWAYSAS(extractDate(order)));

如果你连续不断地存储许多订单,可能需要对旧订单进行归档,这个时候使用范围分区是最好的选择,下面的代码显示了表order2是通过按odate列的值进行分区的,odate列则产生自XML列,同样,你可以使用生成的列作为分区数据库的分配键,也可以作为MDC表的集群键:CREATETABLEorder2(

orderXML,

odateDATEGENERATED ALWAYSAS(extractDate(order))NOTNULL)

PARTITIONBYRANGE (odate)

(PART q109 STARTING('01-01-2009') ENDING ('03-31-2009') INCLUSIVE,

PART q209 ENDING ('06-30-2009') INCLUSIVE,

PART q309 ENDING ('09-30-2009') INCLUSIVE,

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 阅读(1809) 评论(0)  编辑  收藏

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值