6、使用XML索引

来源:互联网 发布:购买淘宝店铺注意事项 编辑:程序博客网 时间:2024/06/01 11:47

和其他常用的数据类型一样,XML数据类型也可以用来创建索引。这一节主要讲解如何在XML类型的数据列上创建和使用索引。

< xmlnamespace prefix ="st1" ns ="urn:schemas-microsoft-com:office:smarttags" />11.6.1  XML索引介绍

SQL Server 2005中,XML数据的存储同二进制大对象是一样的(比如:image类型、text类型等)。此时,对XML数据的查询时关注的焦点就集中到了操作效率上。针对这种情况,SQL Server 2005 提供了专门针对XML数据列的专有索引——XML索引。

XML列上可以创建一个主索引和若干个辅助索引。其中辅助索引可以是PATH型、VALUE型以及PROPERTY型。辅助索引的类型名称已经清楚地表明它们各自关注的XML数据的某一方面。它们可以用于改进不同类型的基于XMLXQuery查询。

如果要创建XML列上辅助索引,那么该列必须要先拥有XML主索引。关于这一点可以将XML主索引理解为一棵树的树干,而把辅助索引理解为树上的枝叶。

后面的小节中将详细介绍如何创建和使用XML索引。

11.6.2  创建一个XML主索引

SQL Server 2005中创建XML主索引的基本语法是。

CREATE  PRIMARY XML INDEX index_name

ON <object> ( xml_column_name )

下面的例子显示了如何在一个XML列上创建一个XML主索引。

--此例子中仍然继续使用前面小节中的MyXMLTb

Create Primary XML Index X_MyXML On MyXMLTb(MyXML)

Go

       如果要删除这个XML索引可以使用下面的T-SQL语句.

Drop Index X_MyXML On MyXMLTb

Go

11.6.3  创建一个XML辅助索引

在一个创建了XML主索引的XML数据列上,还可以创建三种类型的XML辅助索引。分别称作:Value型、Path型、Property型。

创建这三种辅助索引的基本语法如下。

CREATE XML INDEX index_name

    ON <object> ( xml_column_name )

    USING XML INDEX xml_index_name

FOR { VALUE | PATH | PROPERTY }

语法中的xml_index_name就是要在其上建立辅助索引的主XML索引名称,该索引必须已被创建。

下面的示例T-SQL脚本显示了如何创建这三种辅助索引。

Create XML Index X_MyXML_Value On MyXMLTb(MyXML)

USING XML INDEX X_MyXML

For Value

Go

Create XML Index X_MyXML_Path On MyXMLTb(MyXML)

USING XML INDEX X_MyXML

For Path

Go

Create XML Index X_MyXML_Property On MyXMLTb(MyXML)

USING XML INDEX X_MyXML

For Property

Go

下面的脚本显示了如何删除上面这些XML辅助索引。

Drop Index X_MyXML_Value On MyXMLTb

Go

Drop Index X_MyXML_Path On MyXMLTb

Go

Drop Index X_MyXML_Property On MyXMLTb

Go

注意:这里需要注意的是,如果XML辅助索引创建时所指定的XML主索引一旦被删除,那么其上的所有XML辅助索引就会自动被删除。而删除任何一个辅助索引时则不会影响其他的XML索引。

11.6.4  分析XML索引对性能的改进

通常设计合适的索引都可以改进相应查询的效率。XML索引就可以改进XQuery查询的效率。

下面的就用一个例子查询来看看创建XML索引前后对XQuery执行效率的改进。查询如下。

--此例仍然使用前面小节例子中创建的MyXMLTb

Select MyXML.query('//Student') from MyXMLTb

没有在表MyXMLTb上创建XML索引时,SQL Server 2005显示的关键查询执行计划如图11.1所示。

6、使用XML索引 - Gamebaby Rock Sun - Gamebaby Rock Sun的博客

 

11.1 没有使用XML索引时的查询计划

从图11.1中可以看出没有使用索引时SQL Server 2005使用了一个标志函数的运算符。这将引起全表的读取循环。这个运算符实际显示的统计信息如图11.2所示。

6、使用XML索引 - Gamebaby Rock Sun - Gamebaby Rock Sun的博客

11.2 标志函数运算符的统计信息

从图11.2中可以看出这个运算符的CPU开销是1.018,这个值是有些偏高的,如果这样的查询直接被用于应用系统中,肯定会带来严重的性能问题。

11.3显示了创建了XML索引以后,运行同样的查询,SQL Server 2005实际生成的执行计划。

6、使用XML索引 - Gamebaby Rock Sun - Gamebaby Rock Sun的博客

11.3 使用了XML索引后实际执行的关键查询计划

从上图中可以看出最终的表操作运算符被两个聚集索引查找运算符替代,同时两个运算符的比重之和35%+35%=70%也比没有使用XML索引时,一个表值函数运算符90%的比重要小。同时也获得了较好的并发性。其中两个聚集索引的统计信息分别如图11.4和图11.5所示。

6、使用XML索引 - Gamebaby Rock Sun - Gamebaby Rock Sun的博客

11.4 聚集索引查询运算符统计信息之一

从图11.4可以看出,这个聚集索引查询运算符的CPU开销只有0.0001746,是一个很低的值,由此可以看出创建了XML索引改进了这个基于XQuery的查询。

6、使用XML索引 - Gamebaby Rock Sun - Gamebaby Rock Sun的博客

 图

11.5 聚集索引查询运算符统计信息之二

从图11.4和图11.5中可以看出,两个运算符的CPU开销之和0.0003332比没有使用XML索引时的1.018小了四个数量级。由此可以看出XML索引对XQuery查询的改进是有非常大的帮助的。

需要注意的是,和很多事物一样,XML索引既有有利的一面——可以改进XQuery查询,也有不利的一面——会降低Insert语句、Updatamodify函数等的执行效率。这是一个需要仔细权衡的数据库设计问题。此处给出的建议是,仔细分析操作该表的各类查询语句在XML索引有无两种情况下生成的执行计划,根据分析的结果决定是否需要创建XML索引。
原创粉丝点击