《主流DBMS提供的XML数据索引对比研究.doc》由会员分享,可在线阅读,更多相关《主流DBMS提供的XML数据索引对比研究.doc(32页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 目 录1 引言12 索引技术概论12.1 XML索引及其分类22.2 XML数据及XPath查询处理32.3 XML索引分类53 基于SQL SERVER2005的XML索引73.1 XML索引在Sql Server2005中的支持73.2 建立XML索引数据73.2.1 主索引83.2.2 次索引83.2.3 内容索引104 基于ORACLE 10G DB的XML索引114.1 什么是ORACLE XML数据库114.2 索引XML内容125 基于DB2 9 PUREXML的XML索引135.1 XML索引在DB2 9 pureXML中的支持135.1.1 XML索引的SQL函数类型145
2、.1.2 理解DB 2中XPath表达式7145.1.3 节点类型155.2 DB2 9 pureXML中的XML索引技术165.2.1 在路径中使用text()节点165.2.2 使用the UNIQUE关键词175.2.3 使用XML命名空间186 实验对比研究196.1 Sql Server 2005中的实验对比研究196.1.1 实验方法196.1.2 实验结果216.2Oracle 10g DB中的实验对比研究216.2.1 实验方法216.2.2 实验结果246.3 DB2 9 pureXML中的实验对比研究246.3.1 实验方法246.3.2 实验结果277 总结29致谢30参
3、考文献31主流DBMS提供的XML数据索引对比研究1 引言XML(Extensible Markup Language),意为可扩展的标记语言,它是SGML的子集,是一套定义语义标记的规则,它也是一种元标记语言,即定义了用于定义其他与特定领域有关的、语义的、结构化的标记语言的句法语言。随着XML数据量的不断增长,要求更有效的数据管理能力和更快、更精确的查询。为了提高XML数据的查询效率,特别是结构查询的效率,要求有一种很有效的方法XML索引技术。 XML(最新的规范为2004 年的XML1.1)(extensible markup language),即可扩展的标记语言,是一套定义语义标记的规
4、范,其目标是能够定义计算机和人都能方便识别的数据类型.随着网络应用的快速发展,尤其是电子商务、Web服务等应用理念的进一步发展,使得XML类型的数据成为当前主流的数据形式.对XML据的管理也成为研究的热点.同时,随着互联网上XML文档的不断增多,对这些数据的使用越来越依赖于互联网搜索引擎强大的检索能力,对检索XML文档的搜索引擎的研究也就越迫切。如何将XML索引技术与现代主流关系数据库(ORACLE 10G, MICROSOFT SQL SERVER 2005和IBM DB2 9)技术结合起来,使得检索结果更为准确,也使得传输的数据量大大减小。2 索引技术概论 在讨论索引技术时,主要考虑两方面
5、的问题:一是索引的对象,既在什么数据上面建索引;二是索引的组织结构。下面分别讨论这两方面的问题。 在关系世界中,索引的对象很简单,就是元组的某一属性。这是因为在关系数据库里面,只有一种结构关系表,查询的时间直接查询表中的数据项。这种索引就是值索引。然而在XML数据库中,查询是多种多样的。有时是对XML文档中关键字的搜索,这类搜索可以用值索引来辅助;但是更多的是类似于XPath或XQuery那样的查询,这时搜索不仅涉及到值,还涉及到结构(如一个结点在文档树中的路径),因此,仅在某些值上建索引是不够的。在XML-enabled数据库里面,由于结构信息(如一个边的路径)往往分裂在几个表里面,因此无法
6、对路径建索引,查找特定路径的结点往往是通过几个表间的连接(称为structural join或containment query)来实现的,这也是XMLenabled数据库效率低下的原因之一。考虑到这些因素,一般的纯XML数据库都对多个对象建索引,主要有:值索引,即在属性值或结点内容上面建索引;结点名索引,即在结点标记上面建立索引;边或路径索引,即在XML文档树的边上面建立索引。 再看索引的组织形式。在关系数据库中,索引的组织形式主要是B+树及其变体。B+树结构的优点是:它是平衡的,因而对数据项的访问代价是基本确定的;它是扁平的,因而搜索的时候深度不是太深,访问的磁盘I/O不会太多;它是插入,
7、删除和查询时的效率都是较高的,因而综合性能是很好的。用B+树建立值索引毫无疑问是可行的,但是用它来管理XML文档的路径信息可能就不那么如意了。因为当XML文档的模式改变时,索引结构以及索引项可能都做较大调整,很明显这时维护B+树的代价是很高的。并且B+树对索引项的长度和索引项的数目是比较敏感的,如果要在大量长的而且重复较少的数据项上建立索引,B+树就会快速膨胀,从而导致访问时磁盘I/O的增加和更新时的繁琐,因而也不适合直接管理大量的路径信息。 另外一种常用的索引结构是哈希表。哈希表根据一个哈希函数快速将搜索键定位到某个桶(bucket)里面,如果桶中的记录不多就可以很快找到索引项,但是当索引项
8、过多是,桶的空间和数目会很快增长。此外,哈希表的性能取决于哈希函数的选择,一个糟糕的哈希函数同样可以导致索引性能低下,而在很多情况下,在知道索引项性质之前很难选择一个理想的哈希函数。因此哈希表也不一定适合于管理XML数据。 此外,还有一些传统的索引技术,如倒排列表(inverted list),但是它的作用范围很有限,一般用在文本搜索或关键字查询里面,所以只作为一个辅助索引。2.1 XML索引及其分类对XML数据建立有效的索引,是左右XML数据处理性能的重要因素.本节归纳目前XML索引技术的研究现状,将XML索引技术分为两大类:节点记录类索引(本身还可以分为3个小的类型)和结构摘要类索引.根据
9、XML数据查询处理效率以及XML数据修改对XML索引的要求,讨论了相关XML索引方法的优点和不足。2.2 XML数据及XPath查询处理3(a)Sample.xml(b)Sample.dtd图2-1 sample.xml和sample.dtd示例XML规范规定了XML数据必须满足的条件,其基本的形式是XML文档.从逻辑上讲,一个XML文档通常由5部分组成:声明、元素、注释、字符引用和处理指令,为叙述方便,统称为XML数据单元.XML数据内容的限制通常由XML模式(包括DTD和XMLSchema)来描述.图2-1为sample.xml文档及其DTD的示意.图中root为sample.xml的根,
10、它具有3个标签为a 的区段,而每一个a区段都嵌套一个以b 标签为标志的区段.当给定XML 文档时,该文档也就隐含地确定了其中所含的标记单元的顺序,称为XML顺序(XML ordering),这一概念在XML查询处理时是需要考虑的,即查询结果中的标记单元应当具有类似的顺序特征。为了从XML以及半结构化数据中获取所需要的信息,研究人员开发了许多查询语言,包括Lorel,XML-QL,XML-GL,Quilt,XPath,XQuery.它们共同的特征为:采用了正则路径表达式的形式,其本质是捕捉XML数据单元间的结构关系和内容.XPath是实现XML数据周游的基本语言,是XSLT,XQuery的基础.
11、它首先定义了XML数据的树形模型.图2-2即为图2-1的满足XPath数模型定义的XML树.图2-2中每个元素节点左侧的数字表示该节点在前序遍历XML 树形成的节点标签序列中的序号;右侧的数字表示该节点在后序遍历XML树形成的节点标签序列中的序号.由XPath的定义可以构建很复杂的查询语句,主要分为3个层次:线性路径表达式、分支路径表达式和路径树。图2-2 sample.xml对应的XML树当在XML文档类数据之上处理XPath查询时,借助于W3C定义的XML数据处理的两种接口规范,DOM(document object model)和SAX(simple API for XML),处理方式可
12、概括为:顺序读取XML 文档中的节点;如果该节点的路径满足XPath中定义的条件(包括结构关系、测试条件和谓词关系),那么该节点即为XPath查询语句的一个输出.这种基本的线性表达式查询语句的处理方式存在如下两个缺陷:(1) 只能采取周游的方式在XML文档中寻找满足查询语句结构关系的数据单元,即为了获取满足查询路径的结果,必须周游所有可能的数据单元的标签路径,效率不高。以图2-2为例,要想得到文本包含“c3 c4 c5 c6”的“c”节点,那么必须从根节点开始沿着rootabc 的路径到达.如果采取某种索引结构,可以直接定位到目标节点,将会大大提高查询的效率。(2) 对XML中标签路径相同的节
13、点,仍然需要重新遍历它们的路径.这个问题直接来自于(1)。同样以图2-2为例,如果目标节点是c,文档中存在3条相同标签路径的节点路径,而根据上述基本处理方式,为了搜索所有的c节点,必须对同样的路径都要遍历.那么,将同样路径的节点汇集到同一节点中,就可以提高搜索的效率。2.3 XML索引分类(1) 节点记录类索引节点记录类索引本质上即是将XML数据分解为数据单元的记录集合,同时在记录中保存该单元在XML数据中的位置信息.主要有两种获取位置信息的方法,一种是节点序号方法(node numbering method,有时也称为节点标签方法,node labeling method),另一种是节点路径
14、方法(node path method).对它们的研究占了XML数据处理研究文献中相当大的部分.根据路径信息表现形式的不同,节点记录类索引分为3大类:基于节点序号的索引、基于节点路径信息的索引和二者相结合的混合索引。节点序号的基本思想:这类索引中的位置信息是节点在某种遍历序列中的序号.对于一个XML文档,设计遍历XML文档的策略,遍历的最终结果表现为一个由节点组成的序列;相应地,节点的标签在序列中就有一个序号,该序号表明了节点间的次序关系,也能够反映节点间的结构关系,进而,就可以基于该序号信息捕获节点间的结构关系.节点序号类XML索引的基本思想是:基于XML文档设计某种遍历策略,得到由元素组成
15、的序列,节点的标签在序列中就具有唯一的次序,将序列与某指标集(最常用的就是自然数)建立一一映射的关系,对应序列中某个标签就有唯一的序号;对任意两个具有节点序号信息的节点,可以构建某种运算,该运算的结果可以表征节点间的结构关系,即(独立单元属性,位置信息)结构关系映射.根据标签序列生成方式的不同,目前研究文献中序号类索引可分为两种:基于标签有向树的遍历(如先序遍历和后序遍历)和基于字符流模型的顺序处理.根据映射指标集的不同,可分为赋以自然数、赋以局部编码和赋以素数的方式.在序列生成和节点序号赋值的基础上,可以构建不同形式的位置信息,进而形成不同的节点记录索引形式。节点路径的基本思想:节点的路径信
16、息同样蕴含节点在XML数据中结构的信息:如果给定两节点的路径信息,同时预知两节点存在结构关系的情况下,就必然可以获知它们之间的结构关系.即节点A的标签路径包含节点B的标签路径,那么,在XML树中A和B之间一定具有祖先-子孙的结构关系,且B是A的祖先.所以,基于路径信息来获取节点的结构关系就成为另一组XML数据处理技术的思路来源,并演化出基于节点路径的XML索引.这类索引的核心技术是字符串的模式匹配.因而,这类索引记录数据的管理方法,有许多是来自于信息获取领域的。例如,Trie,Patricia trie 以及Suffix tree,甚至Suffix array 等结构.索引记录的基本模式为(数
17、据单元标识,路径信息).由于这类索引的大部分处理模式与传统的模式匹配有很深的关系,在此不再展开叙述.仅对基于路径的多维索引的概念进行简单的叙述。(2) 结构摘要类XML索引的基本思想以XML树结构中节点的路径信息为基础,采取某种约简方式,使得约简后的树结构只维护不同的路径信息,而不会存在具有相同路径的两个节点.这里,结构摘要索引仍然采取标签有向图的结构.当基于结构摘要进行XML查询处理时,就可以避免第1节所述的基本XML查询处理的另一个缺陷。3 基于Sql Server2005的XML索引在MS Sql Server2005中,可以在XML数据类型列上创建XML索引。这会将该列中XML实例上的
18、所有标记、值和路径编入索引,从而提高查询性能。在下列条件下,您的应用程序可能受益于XML索引:(1)对XML列进行查询在您的工作负荷中很常见。必须考虑数据修改过程中的XML索引维护成本;(2)XML值相对较大,而检索的部分相对较小。生成索引可以避免在运行时分析全部数据,并且因为受益于索引查找而提高查询处理的性能。3.1 XML索引在Sql Server2005中的支持查询执行在运行时处理每个 XML 实例;如果XML值比较大或需要在表的许多行中对查询进行求值,则查询执行就会变得非常费时。因此提供了一种索引 XML列的机制来加速查询。B+ 树广泛用于建立关系数据库的索引。XML列的主XML索引在
19、该列中XML实例的所有标记、值和路径上都创建一个B+树索引。通过这种方式,可以有效地对XML数据中的查询进行求值,并且在保留文档顺序和文档结构的同时从B+树重新组合XML结果。 可以在 XML 列中创建次 XML 索引来加速不同类别的常见查询:PATH 索引(用于基于路径的查询)、PROPERTY 索引(用于属性包的情况)和 VALUE 索引(用于基于值的查询)。3.2 建立XML索引数据XML 数据是以内部二进制形式存储的,存储容量可以达到 2 GB。每个查询在运行时一次或多次地解析表中每一行的 XML BLOB。这会使查询处理的速度变得很慢。如果在工作负荷中常常需要进行查询,则建立 XML
20、 列的索引是有好处的,不过,这样做必须考虑在修改数据的过程中维护 XML 索引的成本。XML 索引是通过一个新的 DDL 语句在类型化和非类型化的 XML 列中创建的。这为该列中的所有 XML 实例创建了一个 B+ 树。XML 列中的第一个索引是“主 XML 索引”。通过这个索引,可以在 XML 列中支持三种类型的次 XML 索引来加速普通类的查询。3.2.1 主索引在基表(即定义XML列的表)的主键中,主XML索引需要聚集索引。它在XML节点的信息集项的一个子集中创建一个B+树。B+树的列表示标记,例如元素和属性名称、节点值和节点类型。其他的列捕获XML数据中的文档顺序和结构,以及从XML实
21、例的根节点到每个节点的路径,从而有效地对路径表达式进行求值。基表的主键在主XML索引中复制,以使索引行与基表行相关。XML架构中给定的标记和类型名称被映射为整数值,而映射值存储在 B+ 树中以优化存储。索引中的路径列按照相反的顺序(即从节点到XML实例的根)存储映射值的串联。当路径后缀已知时(在一个路径表达式中,如 /author/last-name),相反的表示使得可以匹配路径值。 如果对基表进行分区,则需要以相同的方式对主 XML 索引进行分区,也就是使用相同的分区函数和分区架构。全部的XML实例都是从XML列检索的(SELECT * FROM docs 或 SELECT xCol FRO
22、M docs)。需要 XML 数据类型方法的查询使用主XML索引,从索引本身返回标量值或XML子树。例:创建主 XML 索引下面的语句在表docs的XML列xCol中创建一个名为idx_xCol的XML索引。CREATE PRIMARY XML INDEX idx_xCol on docs (xCol)3.2.2 次索引一旦主XML索引创建完毕,就可以创建次 XML 索引来加速工作负荷中不同类的查询。三种类型的次XML索引 -PATH、PROPERTY 和 VALUE ,分别对基于路径的查询、自定义属性管理方案和基于值的查询有利。PATH 索引在主XML索引的列(path, value)中构建
23、 B+ 树。该路径的值是通过计算路径表达式和节点的值得出的,如果提供了一个路径值,则也可以使用所提供的值。在已知PATH索引开始字段的情况下,查找PATH索引可以加速路径表达式的求值。最常见的情况是在 SELECT 语句的WHERE子句中对XML列使用exist()方法。PROPERTY 索引在主XML索引的列(PK, path, value)中创建 B+ 树,其中PK是基表的主键。此索引对XML实例中的属性值查找有利。 最后,VALUE 索引在主XML索引的列 (value, path) 中创建一个 B+ 树。此索引对节点的值已知但是其路径没有准确地在查询中指定的查询有利。这通常出现在祖先或
24、自身(descendant-or-self)轴查询中,例如,/authorlast-name=Howard,其中, 元素可以出现在层次的任何一层。它还可以出现在“wildcard”查询中,例如 /book * = novel,其中,查询查找具有“novel”属性值的 元素。此外,VALUE 索引还可用于对类型化的 XML 进行基于值的范围扫描。 可以容纳多达 128 层的 XML 层次;在插入和修改的过程中,如果 XML 实例包含更长的路径,则会被拒绝。 类似地,可以建立一个节点值的前 128 个字节的索引;系统中可以容纳更长的值,但是不会建立索引。例:基于路径的查找假定下面的查询在工作负荷中
25、是常见的:SELECT xColFROM docsWHERE xCol.exist (/bookgenre=”novel”)=1路径表达式 /book/genre 和值“novel”对应于 PATH 索引的键字段。因此,类型 PATH 的次 XML 索引有助于此工作负荷:CREATE XML INDEX idx_xCol_Path on docs (xCol)USING XML INDEX idx_xCol FOR PATH例:获取对象的属性考虑下面的查询,它从表T的每一行检索书的“genre”、“title”和ISBN属性:SELECT xCol.value (/book/genre)1,v
26、archar(50), xCol.value (/book/title)1,varchar(50), xCol.value (/book/ISBN)1,varchar(50),FROM docs属性索引可用于这种情况,该索引创建如下:CREATE XML INDEX idx_xCol_Property on docs (xCol)USING XML INDEX idx_xCol FOR PROPERTY例:基于值的查询在下面的查询中,祖先或自己轴 (/) 指定了部分路径,这样,基于 ISBN 值的查询就可以从 VALUE 索引的使用中受益:SELECT xColFROM docsWHERE x
27、Col.exist(/bookISBN=”1-8610-0157-6”)=1值索引创建如下:CREATE XML INDEX idx_xCol_Value on docs (xCol)USING XML INDEX idx_xCol FOR VALUE3.2.3 内容索引可以在XML列中创建全文本索引;这会建立 XML 值内容的索引而忽略 XML 标记。属性值不是全文本索引的(因为它们被认为是标记的一部分),而元素标记被用作标记边界。可以在XML列中创建XML和全文本索引,并且组合使用全文本搜索和XML索引。使用全文本索引作为第一个筛选器来缩小选择范围,接着再应用XQuery进一步筛选。使用
28、CONTAINS()和 XQuery contains()的全文本搜索有不同的语义。后者是子字符串匹配,而前者是使用词根检索的标记匹配。例:在 XML 列中创建全文本索引在 XML 列中创建全文本索引的步骤与在其他 SQL 类型列中创建全文本索引的步骤是非常相似的。需要在基表中有一个唯一的键列。DDL 语句如下,其中,PK_docs_7F60ED59 是该表的单列主键索引:CREATE FULLTEXT CATALOG ft AS DEFAULTCREATE FULLTEXT INDEX ON dbo.docs (xCol) KEY INDEX PK_doc_7F60ED59例:组合全文搜索和
29、 XML 查询下面的查询检查 XML 值是否在书的标题中包含单词“Secure”:SELECT *FROM docsWHERE CONTAINS(xCol,Secure)AND xCol.exist(/book/title/text()contains(.,”Secure)”)=1CONTAINS() 方法使用全文本索引来产生一个 XML 值的子集,它包含文档中所有的单词“Secure”。exist() 子句确保单词“Secure”出现在书的标题中。4 基于Oracle 10g DB的XML索引为索引XML文档提供多选择,Oracle XML DB允许在XML文档中建立许多不同的索引类型。B树
30、和函数索引可以在一文件集合特定的节点的文档中建立。文本索引技术允许XML aware和全文索引建立在XML文档上。可用的索引自动地被考虑到解决包括一个XPath 或XQuery 表达式的XML 操作优选的方式。Oracle 特定的XPath 广义函数允许Oracle 全文搜索进行在文本节点或属性的内容中。4.1 什么是ORACLE XML数据库Oracle XML DB是用来描述Oracle数据库10g所提供的高性能XML存储和检索技术的术语。该技术扩展了普通的Oracle关系数据库,不仅提供目前最复杂和完整的关系数据库所提供的所有功能,还提供与原生XML数据库所相关的所有功能。 Oracle
31、 XML DB提供存储独立、内容独立和编程语言独立的基础架构来存储和管理 XML 数据。它提供了新的定位和查询数据库中所保存的XML内容的方法并为 XML文档层次结构的管理引入了一个XML信息库。有了Oracle XML DB,您可以同时获得关系数据库技术和XML技术的所有优点。 Oracle XML DB提供下列功能: 一个用于保存和管理XML文档的原生XML数据类型。 一套允许对XML内容进行XML操作的方法和SQL运算符。 将标准W3C XML模式数据模型吸收进Oracle数据库的能力。 XML/SQL二元性,允许XML操作SQL数据和SQL操作XML内容。 访问和更新XML的业界标准方
32、法,包括XPath和SQL/XML。 一个允许利用文件/文件夹/ URL结构组织和管理XML内容的简单、轻型的 XML信息库。 一个允许利用文件/文件夹/ URL结构组织和管理XML内容的简单、轻型的XML 信息库。 一个允许利用文件/文件夹/ URL结构组织和管理XML内容的简单、轻型的XML 信息库。 对业界标准、面向内容和FTP、HTTP、WebDAV协议的原生数据库支持使XML 内容移入、移出 Oracle 数据库成为可能。 将Oracle数据库的企业类管理能力(可靠性、可用性、可伸缩性和坚不可摧坚不可摧的安全)带给XML内容的能力。 4.2 索引XML内容传统关系数据库中保证查询响应
33、时间的标准方法是创建索引,以高效的方式解决查询。Oracle XML DB可使用相同的技术来保证查询XML内容的最优响应时间。 在XML内容上可创建三种索引。对于基于XML模式,并以结构化存储技术保存的XML内容,可创建传统的B树索引。例如下面B树索引的创建:create index ipartnumber on lineitem_table x(x.part.part_number,x.nested_table_id);基于函数的索引实际是所谓的常规的B树索引,但是它会基于一个应用于表数据的函数,而不是直接放在表数据本身上。它建立在仅返回单一的值,而非返回的值多于一的XPath表达式上。在执
34、行查询时,利用这个索引了解应该选取哪些行。这就意味着查询会比执行全表搜索更快。例如下面基于函数的索引:create index fbi_idx on ipurchaseorder_reference on purchaseorder_clob(extractvalue(object_value,/ purchaseorder/ reference);文本的索引是对任何XML文档都可创建的,无论文档内容是否使用结构化存储保存。 Oracle XML DB在对XML内容创建索引时允许使用XPath表达式。索引创建过程中 Oracle XML DB使用XPath重写确定包括在创建索引语句中XPath
35、表达式是否可被重新写入等价的对象关系SQL表达式。如果可以使用对象关系SQL重新申明XPath表达式,那么将对底层的SQL对象创建传统的B树索引。如果不能使用对象关系SQL重申XPath表达式,就将创建函数索引。 在关系数据库应用程序中开发人员不需要因为数据上索引的变化而改变他们的应用程序。对Oracle XML DB这也是真的。要点: XPath重写允许优化器分析查询并确定新的索引提供了更高效的查询解决办法。 XMLType和XPath 抽象可使应用程序员开发应用程序时无需关心底层的存储技术。与传统的关系应用程序一样,索引的创建和删除可调整应用程序的性能,同时不需要重写程序。5 基于DB2
36、9 pureXML的XML索引在传统关系数据索引能包含由一或多个表列组成的索引关键词时,xml索引仅对储藏在单个xml表列中的xml文件进行路径索引和值索引.这章介绍了索引建立在DB2 9 pureXML上的xml文件.我们将介绍基本的创建索引的函数和以及详细说明函数的其他参数。 关于创建索引函数和提供支持xml索引的新函数的基础; 如何用XPath表达式选择要进行索引的文件节点; SQL数据类型用来创建XML索引关键词。5.1 XML索引在DB2 9 pureXML中的支持就像关系数据库中的索引一样,在DB2 9pureXML中用XML索引来改进查询的速度。用户应该经常建立索引来访问数据,结
37、果在于获得选择函数执行索引的数据。尽管索引为通常表现在获得选择函数,其它函数像插入/更新/删除被略微减少,因为当这种函数被执行时,索引的关键词必须要被创建或被删除.用户创造的XML数据索引的数目应该不仅受用户想要频繁进行查询XML数据的影响,而且受用户储藏索引关键词空间的影响.索引建立得越多,储藏索引关键词所需要的的空间就越多。XML索引和关系数据索引的主要区别在于: 索引应该建立在单一的XML列上(不允许复合关键词); 仅符合XML样式的文件才被索引; XML索引每一行可以创建0,1或者多个关键词。5.1.1 XML索引的SQL函数类型 VARCHAR(n):用于带有字符串值的节点,已知字符
38、串值的最大长度为 n。 VARCHAR HASHED:用于带有字符串值的节点,字符串值的长度为任意长度。该索引包含实际字符串的散列值,只能用于等式谓词,不能用于范围谓词。 DOUBLE:用于带有任意数值类型的节点。 DATE and TIMESTAMP:用于带有日期或时间戳值的节点。VARCHAR(n) 索引的长度是一个强制约束。如果插入一个文档,其中索引元素或属性的值超过了最大长度 n,则插入操作将失败。同样,如果索引元素或属性的值大于 n,则 VARCHAR(n) 索引的 create index(DB2里用CEATE INDEX来创建索引) 语句将失败。DOUBLE、DATE 或 TIM
39、ESTAMP 索引不是强制约束。5.1.2 理解DB 2中XPath表达式7“/”符号“/”是一个XPath表达的基本轴,被用来定位节点的直接子元素。CREATE INDEX firstnameindex ON companies(doc) GENRATE KEY USING XMLPATTERN/company/emp/name/firstAS SQL VARCHAR(10)上例中用“/”这基本轴去定位XML元素,和从根要素(公司)到元素first创造一路径,其素说明一雇员的名字。“/”符号通常在XML索引声明中使用另一轴是“/”.使用/轴去定位XML文档和它的子节点以及上下文中所有的后裔。
40、例如如果你想在XML文件中索引所有的id attributes,你可以用以下的实例:CREATE INDEX allidindex ON companies(doc) GENRATE KEY USING XMLPATTERN/idAS SQL VARCHAR HASHED“”符号“”符号是定义元素属性路径的好帮手.在你的XPath表达式中,“”符号后面紧着属性名。CREATE INDEX empsalaryindex ON companies(doc) GENRATE KEY USING XMLPATTERN/company/emp/salaryAS SQL DOUBLECREATE INDE
41、X deptidindex ON companies(doc) GENRATE KEY USING XMLPATTERN/company/emp/dept/idAS SQL VARCHAR(5)前个索引为每一个员工的工资属性节点创建索引,而其次创建员工部门的编号属性的索引。“*”符号星号“*”能被使用指定任何文件节点.当我们想要把有不同的子节点编入索引时候,这星号是非常有用。除了上面所介绍的XPath轴之外,DB2 9 pureXml也提供以下XPath轴的支持:child:, descendant:, self:, descendant-or-self: and attribute:.。 5
42、.1.3 节点类型DB2 9 pureXML中支持的节点类型的是:node(),text(),comment()和processing-instruction()。最普通的节点类型是text()和node()。text()节点类型把节点的文本内容看成一体;node()跟上一节的星号“*”一样,指定任何文件节点。5.2 DB2 9 pureXML中的XML索引技术DB2 9 提供了 pureXML存储以及XML索引、作为查询语言的 XQuery 和 SQL/XML、XML 模式支持、对实用程序(如 Import/Export 和 Runstats)的 XML 扩展。正如在关系查询中一样,索引对于
43、高性能的 XQuery 和 SQL/XML 是至关重要的。5.2.1 在路径中使用text()节点在XPath表达式中文本节点的存在是当它为非叶元素原理索引时产生重要影响是重大的和应该被考虑的。比如,考虑下面图5-1的XML元素:图5-1这个XPath 表达式 /book/price 和 /book/price/text() 是不同的。前者识别了元素节点 “price”,而后者指向值为 “29” 的文本节点。因此,下面两个查询将返回不同的结果。 XQUERY for $b in db2-fn:xmlcolumn(BOOKS.BOOKINFO)/bookreturn $b/priceXQUERY
44、 for $b in db2-fn:xmlcolumn(BOOKS.BOOKINFO)/bookreturn $b/price/text()当节点名被使用而没text()时,结果是连接它的文本内容和它的子文本内容。如果就算你使用路径表达式中的text()节点,你将仅得到当前节点而不是它的子文本目录。简单地说,建议不要在 XML 索引定义或查询谓词中使用 /text()。为了支持以 /text() 结尾的任何路径表达式的谓词,可能会在 XML 模式 /text() 上定义索引。但是此类索引将包含 XML 列中所有文档的全部文本节点值。因此,该索引是非常庞大的,并且在插入、更新和删除操作过程中进行
45、维护的开销也是很大的。一般情况下,应该避免使用此类索引,除非应用程序大部分是只读的,并且确实无法预测在搜索条件中使用哪些元素。5.2.2 使用the UNIQUE关键词The UNIQUE关键词能被使用在CREATE INDEX函数中加强唯一的储藏单一XML列中所有的XML文件.一个节点被强制使用索引数据类型,在映射到索引数据类型之后,它的XML路径和值是唯一确定的。在XML文件上建立unique索引的句法如下:CREATE UNIQUE INDEX uniqueempindex ON companies(doc) GENRATE KEY USING XMLPATTERN/company/em
46、p/idAS SQL DOUBLE前面的函数将加强所有属性编号节点去配对路径表达式/company/emp/id。当the UNIQUE关键词确定时,不能包含的路径表达式的说明: desdendant: descendant-or-self: / wildcards for XML name test node() or processing-instruction() for XML node kind test当转换成索引数据类型时,unique XML文件节点值取决于双重的索引关键词也有几种情况: DOUBLE:当储藏为DOUBLE时,无限小数的类型和64字节整数可能失去精确性。 VAR
47、CHAR HASHED:唯一字体字符串可能取决于相同的hash值。5.2.3 使用XML命名空间XML命名空间在XML文件中经常被使用来获取索引含义。考虑下列CREATE INDEX函数:CREATE INDEX firstnameindex ON companies(doc) GENRATE KEY USING XMLPATTERN/company/emp/name/firstAS SQL VARCHAR(10)和以下图5-2的XML文件:图5-2在这例子文件中,默认的命名空间是,并且所有的文件节点都属于这命名空间。因为这,前面的索引将不跟任何文件节点配对,因为这些节点由不属于这命名空间的路径表达式。为了建立和前面例子中的文件节点配对的索引,我们需要给CREATE INDEX函数加命名空间的声明,使用默认的命名空间声明实现它最常用的方法。如:CREATE INDE