摘要:xml查询语言的共同特点是利用路径表达式来导航xml文档的查询并返回指定路径所能访问到的节点集,因此路径表达式的查询优化是xml数据库查询优化的关键,本文详细分析了当前路径表达式查询的几种优化技术,指出了它们要解决的关键问题和主要技术特点。
1 基本概念
1.1 xml数据模型和xml数据模式
一个xml文档树是一个有序标签树(如果考虑元素之间的应用关系则以xml文档的基本结构为图),每个节点与一个元素或值(文本)相对应,边表示元素和子元素(或值)之间的嵌套关系。xml文档的数据模式是一个有向图,它为xml数据提供完整性约束。
1.2 xml数据的编码方法
到目前为止处理路径表达式查询有两种方法:一种是基于树遍历的方法,另一种不遍历文档树就可以快速决定节点之间结构关系的方法,元素之间结构关系的确定主要依赖于有效的xml节点编码方法。
1.2.1 基于区域的编码方案
目前,最常用的编码方法是区域编码方法,最先使用区域编码确定树节点之间的结构关系的是dietz。它给每个节点赋予一个(pre,post)编码,其中,pre是节点的前序遍历值,post是节点的后序遍历值,对于任意两个不同的节点x和y,x是y的一个祖先当且仅当x.pre
文献。给每个节点赋予一个(start,end)编码,一个节点的start和end值是该元素的开始和结尾的绝对物理或逻辑位移,如果一个节点的编码所覆盖的区域被另一个节点的编码所覆盖的区域完全包含,则这个节点是另一个节点的后代节点。wWW.133229.cOM为适用于多个文档查询和父子关系的确定,还可以将元素的编码扩展为(d,cid,start,end,levd),docid是文档的标识符,level是节点在文档树中的层数。文献提出一种类似于区域编码方案——扩展的前序和后代范围编码,其目是的为了支持数据的动态插入和删除,每个节点被赋予一个(order,size),order是节点的前序遍历序号。size表示节点所覆盖的范围,它可以是任意一个大于该节点后代节点总数的整数值。
除了区域编码以外还有另外一种相对区域编码方,每个节点被赋予一个到其父节点的相对位移。这种编码可以转换成区域编码,其主要缺点是为了确定节点的绝对位置查询代价沿着查询路径从祖先节点到被查询节点逐步增加。
1.2.2 基于前缀的编码方法
不同于区域编码方法,基于前缀的编码方式保存路径信息。在这种编码方法中祖先后代关系和前缀子串的包含关系相对应。文献提出了k-ary编码,该方法通过增加虚节点把文档看成一个完全k分树,根据树的层次遍历顺序给树中的节点编码,在这种编码方法中节点的编码带有文档的结构信息。类似于k-ary编码,文献提出了一种特殊的pbitree编码,这种编码方案是通过增加虚拟节点将文档树嵌入到一个完全二叉树中。这种编码的优点是可以利用完全二叉树的优良特性来计算节点间的结构关系。pbitree中的虚拟节点起着—个占位符的作用,这样有利于数据的动态更新,同时它们对查询性能也有一定的影响。
1.3 xml数据索引
为了提高查询的性能,许多专家和学者都致力于索引的研究与开发。目前提出的索引有两种:一种是基于结构连接的索引;另一种是基于路径的索引。基于结构连接的索引m首先将文档树中的所有节点以的形式进行分解后存储在多张表中。这样,当处理查询//e1/e2/……/en时,对包含ei(i=-1,…,m)的表按次序要进行多次连接操作得到查询结果。基于路径的索引则是以文档树为基本数据结构,按照路径将树中的节点进行拆分、合并等操作,索引结构仍然是一个树,使用这种索引处理查询//el/e2/……/en时,基本上要遍历整个索引树才能得到结果。文献提出了一种自适应的路径索引结构,这种索引利用频繁使用的路径来改善查询性能,并且这种索引可以随着查询工作量的不同而动态改变,从而有效地缩小了索引文件。
2 路径表达式的查询处理方式
2.1 树遍历方法
最朴素的路径访问方法是树遍历的方法:一般采用自顶向下的方式遍历文档树,使用该方法进行查询时需要遍历某元素通往叶子节点的所有可能路径。为了减少树遍历的代价引入自底向上的方法,首先查找符合谓词条件的所有原子节点,然后再寻找它们的父节点。这种方法一般情况下比较简单、耗时较少。但对于符合谓词条件的节点数目很大而符合路径表达式的路径很少时,这种遍历方式的代价可能会高于自顶向下方式。一种折中的方法是同时按自顶向下和自底向上两种方法进行遍历,最后在路径的某个中间位置汇合,从而得到查询结果。当路径上某节点的扇人度(在文档中的)很大而符合谓词条件的原子节点很少时,该方法可以达到最优。在这种方法中优化路径表达式查询的一个中心思想是设法缩小查询范围。使得不需要遍历整个树就可以获得符合条件的查询结果。
2.2 路径分解法
这一种方法是目前用的比较多的,它的基本思路是将复杂的查询路径分解成简单路径,简单路径可以是由一个元素、一个谓词条件或一个元素加一个谓词条件,还可以是由两个元素组成的路径。首先计算这些简单路径表达式,再将每个简单路径表达式的计算结果连接起来。其本质确定节点间的结构关系(祖先后代或父子关系),因此这种操作叫结构连接。像关系数据库中的连接运算一样,结构连接操作的代价非常昂贵,结构连接又是查询处理的核心操作,因此在这种查询处理模式中查询优化的关键开发高效的结构连接算法,同时结构连接的顺序也极大地影响着结构连接运算的性能。
3 路径表达查询优化的一般方法
3.1 路径表达式的重写优化
路径表达式重写优化的基本思想将复杂的、高代价的查询路径表达式转换为简单的、低代价的等价路径表达式。查询重写技术的一般特征可以概括如下:①重写优化发生在查询解析之后查询计划生成之前;②重写优化是将一个查询转换为一个等价的查询;③要使用启发式方法选择查询转换方法,被选择的查询转换方法能改善大多数查询的执行性能;④查询重写的依据通常是查询本身获得信息、完整性约束或数据模式,而不考虑数据以及数据的存储方式和数据的统计信息。
3.1.1 根据结构约束删除冗余
最先研究路径表达式最小化问题是和,文献中只对不包括祖先后代边“//”的简单路径表达式进行最小化,而文献研究了不包含*的路径表达式的最小化问题。其基本思想是将查询中的路径表示为查询模式树,根据给定的结构约束,逐步查询模式树中冗余路径节点或冗余谓词。
文献对包含全部操作符{/,//[],*}的路径表达式的最小化进行了研究,算法的基本思想是递归地从原模式树中查找最小子模式并连接它们,证明了这是一个np完全问题,同时,它还指出:在对路径表达式分支个数和形状加以一定限制的情况下。表达式最小化算法的复杂度可以达到多项式级。很显然,在实际查询中用户不可能将查询限制成一种特定形式的路径表达式。
3.1.2 删除路径表达式中的固有冗余
文献中提出了两种优化策略:缩短路径策略和补路径策略。缩短路径法是试图用等价相对路径取代绝对路径,缩短路径表达式本身,从而降低查询的代价。这种方法利用元素的唯一访问路径、唯一父元素、关键祖先等几个概念把绝对路径表达式转换为相对路径表达式,这样路径表达式的查询匹配就不再从根元素开始,从而缩短了路径表达式查询时间。如假定某查询的绝对路径表达式eicle2c2e3…cnen,如果uap(e2)=c1e2,则可以用c2e3…cnen代替eicle2c2e3…cnen。这里的关键问题确定唯一访问路径、唯一父元素和关键祖先。
在补路径法中定义了互补路径,相对于某元素的互补路径是等价的,这样就可以用补路径替换原查询。其基本思想是把用户书写的复杂的、代价高的查询路径表达式用一些简单的、查询代价低的互补路径表达式来替代。这种策略的目的是减少连接次数和连接结果集的大小,因此怎样确定查询路径的互补路径并进行代价估算成为其关键问题。
3.1.3 删除非冗余的通配符步
当在某条路径中一个元素名未知或无关紧要时通常采用通配符。进行路径匹配时,通配符需要和当前节点的所有子节点(或后代节点)匹配,由此可见,通配符的计算代价相当高。文献中提出消除路径表达式中的非冗余的通配符步,从而降低路径表达式的计算代价。为了消除路径中的通配符步,引入一个layer∞ds重写有通配符的路径表达式查询,在形如child::*/…/child*/ehild1:的查询中,layer axis可以用来替代所有路径通配步,从而把查询等价地表示为li::t1。这样一方面缩短了路径表达式,另一方面使得系统仅仅加载与查询相关的xml数据,从而大大的优化了查询。
3.2 基于树遍历的路径查询优化
基于树遍历的查询优化要使用路径索引缩小搜索范围,这种优化方法的关键问题是要设计出有效合理的便于维护的路径索引。dataguides算得上是最早的路径索引,也是路径索引中最有影响力的代表。它采用了一种标签路径合并策略对文档结构进行缩减,dmguides中的每个节点都有一个目标集。这个目标集记录了通过这个标签路径可访问到的数据节点,这样执行一个路径查询时只需要在dataguides中查找该路径,获得的目标集即为满足条件的查询结果。当文档的数据结构比较规则时dataguides能很好地缩减文档的结构,从而极大地改善查询的性能。
文献中提出了一种使用图模式(graph schemas)缩小查询范围的方法。这里的图模式也起着dataguides的作用,但是它采用了合并同类边的策略。图模式中的节点叫状态,每个状态都对应一个状态扩展,集即该状态在文档中所对应的节点集。在此基础上文档提出了两种查询优化策略:剪切查询和使用状态扩展集重写查询。剪切查询是将查询的搜索限制在仅与查询结果有关的子树上,后者则是将原查询改写为在图模式上的查询,两种方法都使用非确定自动机为剪切工具。
不同于以上两种方式,文献提出了一种新的路径查询方法,该方法将xml文档中的文本数据抽取出来单独存储,这样文档树仅由带标签的元素或属性组成,这样的结构被叫做文档的骨架(skeleton)。为了使大的文档的骨架尽可能地放入内存中。这个树骨架进一步通过共享的公共子树被压缩,被压缩的树骨架的每个节点与未压缩树的一组节点相对应,他们之间的对应关系用双向相似关系表示。
3.3 基于路径分解的查询优化
结构连接是基于节点在nml文档中的位置表示确定xml节点间的包含关系。给定一个祖先(或父)节点集合a和一个后代(或子)节点集合d,结构连接操作的任务就是要用高效的方法找到所有的节点对(ai,di),其中ai是di的祖先(或父亲),ai、di分别是a、d中的元素。a、d可能来自索引扫描也可能是某个计算的中间结果。结构连接运算的代价非常昂贵,因此结构连接算法的好坏直接影响着查询的效率,同时结构连接的顺序也极大地影响着结构连接运算的性能。
3.3.1 结构连接算法
目前,已经提出的结构连接算法有两种:排序合并[2,3,7,19]和划分方法。排序合并法的主要特点是:①节点采用区域编码确定节点间的结构关系;②要求输入的数据集有序或在数据集上建立索引;③为了快速定位某类节点,可以利用元素索引、路径索引或值索引。文献中提出了一种多谓词合并连接算法(mp-mgjn),该算法需要多次扫描数据集;文献中提出的ε-jion、εa-lion和κe-iion算法存在同样的缺点。文献提出了两类算法:树合并(tree-merge)算法和堆栈合并(stack-tree)算法,前者是传统数据库合并连接的推广,后者是一种基于堆栈的结构连接的算法,通过内存中保留一个栈结构来达到对输入数据的一次扫描的目标。文献对stack-tree算法做了改进,利用附加的索引跳过不需要参加连接的节点。堆栈合并算法(stack-tree)既可以应用在xml的关系存储系统中,也可以应用在原生xml系统中。
除了基于区域编码的结构连接算法,文献目中还针对它提出的pbitree编码提出了基于划分的结构连接算法,其划分策略有两种:水平划分和垂直划分,分别按节点在树中的高度和所在分支对数据集合的划分,这种算法不要求输入的数据有序或建立索引。结构连接算法在一定程度上依赖于节点的编码方法,目前普遍使用的编码方法是区域编码。由于使用区域编码可以快速确定节点间的包含关系,开发高效基于区域编码的结构连接算法仍然是一个值得研究的课题。
3.3.2 结构连接的顺序选择
在结构连接中,无论采用什么样的结构连接算法,结构连接的顺序极大地影响着结构连接运算的性能,文献使用简单的代价估算模型提出了5种结构连接的顺序选择算法。其基本思想是使用动态规划算法在整个解空间中搜索代价最小的连接计划,当连接节点过多时解空间会发生组合爆炸,使用动态规划算法进行搜索将会变得非常缓慢。为了加速搜索速度,在动态规划算法中引入了各种不同的启发式规则,这虽然极大地提高了搜索速度却冒着一些可能丢失最优解的风险。结构连接顺序选择的目标是用较小的代价获得最优的连接计划,要实现这个目标还有待于新的结构连接顺序选择算法的提出。
4 总结
xml路径表达式查询优化技术是xml查询优化的关键技术。文中概括了3种优化技术。重写优化技术在查询解析之后查询计划生成之前使用,其目的是消除路径中的冗余步,把长的查询路径变为等价的短路径,一方面在基于路径分解查询中减少连接次数和中间连接结果,另一方面在树遍历方法中也可以减少扫描的节点数,从而极大地优化了查询性能。基于树遍历的查询优化和基于路径分解的查询优化则是在查询计划生成阶段使用的。采用什么样的优化技术主要取决于路径表达式的处理方法。节点编码技术和结构连接紧密相关,索引技术也是xml查询优化的关键技术,在这些优化技术中很少使用到xml的数据模式(dtd或schame)。在查询中合理有效地使用数据模式将会给查询优化带来一片新的天地。