成都网站建设
|
域名注册
|
虚拟主机
|
网站制作
|
网站案例
|
网站优化
|
网站推广
|
企业邮局
|
服务器租用
|
广告设计
首页
服务器租用
企业邮箱
虚拟主机
网站程序
营销推广
网站建设
域名注册
前端开发
网站备案
网站空间
|
独立ip空间
|
双线主机
|
php虚拟主机
|
免备案空间
|
香港空间
|
云空间
|
vps主机
|
服务器租用
|
服务器托管
|
云服务器
|
jsp空间
|
网站空间报价
虚拟主机
主机管理
主机购买
数据库
主机续费升级
FTP上传
服务器租用
web服务器
FTP服务器
服务器托管
服务器租用
vps主机服务器
企业邮箱
企业邮箱优势
企业邮箱设置
邮箱收发问题
邮箱功能讲解
邮箱其他问题
网站程序
java教程
asp程序
asp.net程序
vb编程
php程序
营销推广
seo优化
网站推广
搜索引擎
免费资源
网站建设
网站方案
网站改版
网页设计
网站维护
网站策划
域名注册
域名转入\转出
英文域名
通用网址
中文域名
域名解析
前端开发
html
jQuery
JavaScript教程
css
div+css
网站备案
备案流程指南
备案资料下载
备案常见问题
各省备案要求
移动互联网
wap手机网站
app应用开发
微网站
当前位置:
创新互联
>>
常见问题
>>
虚拟主机
>>
数据库
>>
DB2中自定义XML存储及其使用环境
DB2中自定义XML存储及其使用环境
作者:创新互联 文章来源:虚拟主机 点击数:
更新时间:2013-12-16
使用IBM DB2 for z/OS和DB2 for Linux,UNIX和Windows (LUW),那就没有问题,下面让我们一起回顾一下什么时候使用XML存储,以及如何自定义XML存储的一些最佳实践吧!
为了形象地说明,我将使用一个XML文档,内容如下:
<order OrderID="9001" OrderDate="2009-10-18">> <customerID>26914</customerID> <item id="LK-486"> <name>Magic Potion</name> <size>300ml</size> <price>19.99</price> </item> <item id="VF-145"> <name>Crystal Ball, Deluxe</name> <color>crystal clear</color> <price>295.00</price> </item> </order>
它展示了一个包括订单ID,日期,客户ID和其它条目的订单XML文档,注意有些条目的描述方式有所不同,如size和color。我们假设需要在DB2中管理许多与此类似的XML文档。
如何拆分和重组XML
我在另一篇文章“15个DB2 pureXML性能最佳实践”中谈到了你应该明智地选择文档的粒度,实际上就是要将存储在DB2中的XML文档与应用程序的业务逻辑对象和主要的访问粒度匹配。
在我们的例子中,假设订单变化非常频繁,订单内的条目读取,添加或删除是最关键的操作,需要最佳的性能,在这种情况下,你可以考虑将订单文档拆分,将每一个条目作为一个独立的文档存储到DB2表的每一行中,这个存储方法(与原来的完整存储订单文档的方法相比)的好处是它使得操作所存储的数据更容易,更快速:
可以使用单行读取检索一个条目,不用从一个完整的订单文档中抽取条目了;
可以通过删除表中的行简单地从订单中删除一个条目,不再需要操作完整的订单文档;
可以迅速插入一个新条目到订单中,这时也不需要操作完整的订单文档。
这种轻松添加和移除订单条目的功能在DB2 9 for z/OS中尤其有价值,因为这个版本不支持在现有XML文档中添加或删除元素。
下面的代码显示了一个表的定义,以及拆分一个订单文档的INSERT语句,相关的列分别存储订单ID,客户ID,订单日期和一个条目流水号。
CREATE TABLE items(ordID INTEGER, custID INTEGER, odate DATE, seqNo INTEGER, item XML); INSERT INTO items(ordID, custID, odate, seqno, item) SELECT T.ordID, T.custID, T.odate, T.seqno, XMLDOCUMENT( T.item) FROM XMLTABLE('$d/order/item' PASSING cast(? AS XML) "d" COLUMNS ordID INTEGER PATH '../@OrderID', custID INTEGER PATH '../customerID' odate DATE PATH '../@OrderDate', seqNo FOR ORDINALITY, item XML PATH '.') AS T; 条目信息是以XML格式存储的,因为条目可能有不同的元素和属性,如:
ORDID CUSTID ODATE SEQNO ITEM ----- ----- ------ ----- ----- 9001 26914 10/18/2009 1 <item id="LK-486"> <name>Magic Potion</name> <size>300ml</size> <price>19.99</price> </item> 9001 26914 10/18/2009 2 <item id="VF-145"> <name>Crystal Ball, Deluxe</name> <color>crystal clear</color> <price>295.00</price> </item> 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子句,这样可以确保还原后的订单文档和原始文档中的条目显示顺序是一致的。
SELECT XMLELEMENT(name "order", XMLATTRIBUTES(ordID AS "OrderID", odate as "OrderDate"), XMLELEMENT(name "customerID", custID) XMLAGG(item ORDER BY seqno) ) FROM items WHERE ordID = 9001 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属性:
CREATE FUNCTION extractDate(doc XML) RETURNS DATE LANGUAGE SQL CONTAINS SQL NO EXTERNAL ACTION DETERMINISTIC RETURN XMLCAST(XMLQUERY('$d/order/@OrderDate' PASSING doc AS "d") AS DATE); 你可以在SELECT查询和其它SQL语句中使用这个UDF,但也要定义一个生成列,对于下面的示例,假设检索和插入完整的订单是最关键的操作,在这种情况下,完整地存储订单文档是最好的选择。下面的代码定义了一个使用XML列存储订单的表,并自动抽取订单日期填充到关联的列(odate)中。一条INSERT语句现在可以简单地插入一个XML文档到order列中,不需要考虑抽取值到关联列中:
CREATE TABLE orders( order XML, odate DATE GENERATED ALWAYS AS (extractDate(order))); 如果你连续不断地存储许多订单,可能需要对旧订单进行归档,这个时候使用范围分区是最好的选择,下面的代码显示了表order2是通过按odate列的值进行分区的,odate列则产生自XML列,同样,你可以使用生成的列作为分区数据库的分配键,也可以作为MDC表的集群键:
CREATE TABLE order2( order XML, odate DATE GENERATED ALWAYS AS (extractDate(order)) NOT NULL) PARTITION BY RANGE (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);
Windows平台上Oracle数据库服务解析
:上一篇
详解如何挑战4秒内百万级数据导入SQL Server
:下一篇
数据库相关文章
sql2012无法更改设计数据库...
Windows平台上Oracle...
Windows平台下DB2 Ex...
Windows平台下DB2 Ex...
MSSQL使用说明
MYSQL使用帮助
MSSQL和MYSQL有什么区别...
如何限制Mssql数据库占用最大...
创新互联专注虚拟主机/网站空间多年,高速、稳定、安全有保障!虚拟主机首选创新互联。
移动互联网
|
网站备案
|
前端开发
|
域名注册
|
网站建设
|
营销推广
|
网站程序
|
虚拟主机
|
企业邮箱
|
服务器租用
|
热门搜索
服务电话:028-86922220 13518219792 公司地址:成都市太升南路288号锦天国际A幢10楼2号
企业邮箱:
service@cdxwcx.com
版权所有:成都创新互联科技有限公司 蜀ICP备09010846号
成都网站建设
XML存储及其使用 自定义XML存储及其使用环境