XML(eXtensible Markup Language可扩展标记语言)数据的自我描述性使其具有高度的结构化,良好的存储格式等特点,而且XML文档和HTML一样便于网络传输。因此,XML被广泛应用而成为数据定义,数据交换和数据共享的主要标准。
目前XML 数据库主要研究的方向分为两大块,一是Native XML数据库系统,也称原生或纯XML数据库,如Tamino、Ipedo等;二是XML-enabled 数据库系统,即在已有的关系数据库系统或面向对象数据库系统的基础上扩充对XML的支持,这种数据库的优点在于可以充分利用已有的非常成熟的关系数据库技术。在关系数据库系统上扩展对XML支持的一个重要部分就是实现XQuery查询。
达梦关公司的DM XML支持项目是以达梦关系数据库为平台,扩展了对XML的支持,研究和实现基于关系数据库XQuery查询优化技术,实现了高效的XQuery查询。
XQuery相关概念
XQuery是XML的查询语言,XQuery与XML文档的关系相当与SQL与关系数据的关系。与XQuery紧密相关的一个概念是XPath,他们都是W3C的推荐规范。XPath是XML文档的路径语言,用来在XML文档中对文档数据进行寻址。XQuery是XPath的扩展。目前这两个规范的最新版本是XPath 2.0和XQuery 1.0,前者是后者的严格句法子集,并已成为推荐标准。
XPath表达式通过若干“路径步”在XML文档中进行定位(navigate)。对于每一步(step),一个“轴”(axes)用来描述本步中的中间结果森林所包含文档节点(以及这些节点的子树),XPath表达式中包含13种轴,其中通常使用的children和descendant-or-self轴缩写为 / 和 // 。
FLWOR表达式是XQuery对XPath的重要扩展之一,即for,let,where,order,return表达式的组合。for,let表达式以不同的方式将一个序列绑定到一个变量,这个序列可以是XPath路径表达式返回的节点序列,where,order表达式对这些序列的输出进行过滤和排序,return表达式输出结果序列,这个序列可以是带有绑定变量的路径表达式,而且return表达式支持XML片断的构造。
XML查询优化的概况
传统的数据优化已有成熟的理论和方法:其中普遍采用的是基于代价的优化。如果把这种思想应用到XML的XQuery查询优化,我们就可以看到一些问题。
(1)没有完善的查询代数标准;反观关系数据库的优化理论,正是因为有非常成熟的关系代数语言,能很好的支持查询语义和查询优化,所以关系数据库能成为主流的数据管理方式。
(2)没有精确的代价估计;由于XML数据和关系数据的本身结构和分布特点上的差别决定了探索适合于XML查询代价估计模型的必要性。
(3)没有足够的统计信息;足够精确的统计信息是保证查询优化有效性的基础;缺乏足够的统计信息,是造成估计与实际情况产生误差的重要因素。
目前的XML查询优化主要有下面一些技术:
然后编写关于这2个大字段的Java对象文件TestLob.java,分别定义类型为CLOB和BLOB属性字段为String和byte[]类型,其中由于CLOB是处理大文本类型所以它对应了Java中的String类型,BLOB是处理一些以二进制流形势存储的没有严格定义的大文件所以让它使用byte[]类型,然后分别定义这2个属性的Getter和Setter方法,相关代码如下:
1.表达式重写
通常XML查询用树的形式表达,也称为树模式查询(Pattern Tree Query PTQ)。查询的最小化就是对查询树化简的过程。孟小峰等中提出XQuery的PTQ优化分为两个步骤:首先是不依据任何外部信息的语法优化,然后是根据XML文档的外部信息,如DTD,schema等,进行的语义优化。基于这种处理步骤,优化技术可以分为基于DTD的或独立于DTD的。重写表达式的基本思想是在等价的前提下,按照一定的规则转换XQuery表达式,得到效率更高的表达式,实际上就是对查询模式树的化简。研究认为独立于DTD的优化能力很有限,引入DTD能有更大的优化空间,但目前的算法在优化的彻底性和效率上还有改进的余地。
2.构造查询代数
目前国内外学者已经提出了很多种XML查询代数。这些查询代数或多或少借鉴了关系代数里的一些思想。如Timber的TAX,国内的OrientXA,还有XAL,XOM,OPAL,SAL等。目前的XML代数的着重点还在于查询语义的表达上,没有或很少考虑基于代数之上的查询优化,而且没有统一的标准,各种代数之间少有通用性。