手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网络编程>Mssql>列表

MS SQL SERVER2005 XML 最好实践

来源:互联网 作者:west263.com 时间:2008-04-02
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
XML 列中检索完整的 XML 实例,例如 SELECT *。查询使用主 XML 索引,并通过使用索引本身返回标量值或 XML 子树。

示例:创建主 XML 索引
在大多数示例中,使用包含非类型化的 XML 列的表 T (pk INT PRIMARY KEY, xCol XML)。能够采用简单的方式将这些示例扩展为类型化的 XML。有关如何使用类型化的 XML 的周详信息,请参阅 xml 数据类型。为简化起见,针对 XML 数据实例说明了查询,如下所示:

复制代码
<book genre="security" publicationdate="2002" ISBN="0-7356-1588-2"> <title>Writing Secure Code</title> <author> <first-name>Michael</first-name> <last-name>Howard</last-name> </author> <author> <first-name>David</first-name> <last-name>LeBlanc</last-name> </author> <price>39.99</price></book>

以下语句对表 T 的 XML 列 xCol 创建 XML 索引(名为 idx_xCol):

复制代码
CREATE PRIMARY XML INDEX idx_xCol on T (xCol)

辅助 XML 索引
创建了主 XML 索引之后,您可能希望创建辅助 XML 索引来提高工作负荷中不同种类查询的速度。三种类型的辅助 XML 索引(即 PATH、PROPERTY 和 VALUE)分别用于优化基于路径的查询、自定义属性管理方案和基于值的查询。PATH 索引功能是按文档顺序对列中的任何 XML 实例生成各个 XML 节点的 (path, value) 对的 B 树。PROPERTY 索引功能是创建各个 XML 实例中 (PK, path, value) 对的聚集 B 树,其中 PK 是基表的主键。最后,VALUE 索引功能是按文档顺序对 XML 列中的任何 XML 实例创建每个节点的 (value, path) 对的 B 树。

下面是创建一个或多个这些索引的一些准则:

假如工作负荷对 XML 列大量使用路径表达式,则 PATH 辅助 XML 索引可能会提高工作负荷的处理速度。最常见的情况是在 Transact-SQL 的 WHERE 子句中对 XML 列使用 exist() 方法。


假如工作负荷通过使用路径表达式从单个 XML 实例中检索多个值,则在 PROPERTY 索引中聚集各个 XML 实例中的路径可能会很有用。这种情况通常出现在属性包方案中,此时提取对象的属性并且已知其主键值。


假如工作负荷涉及查询 XML 实例中的值,但不知道包含那些值的元素名称或属性名称,则您可能希望创建 VALUE 索引。这通常出现在 descendant 轴查找中,例如 //author[last-name="Howard"],其中 <author> 元素能够出现在层次结构的任何级别上。这种情况也出现在通配符查询中,例如 /book [@* = "novel"],其中查询将查找具备某个值为“novel”的属性的 <book> 元素。


示例:基于路径的查找
为了进行说明,假定以下查询在您的工作负荷中很常见:

复制代码
SELECT pk, xColFROM TWHERE xCol.exist ('/book/@genre[.="novel"]') = 1

路径表达式 /book/@genre 和值“novel”对应于 PATH 索引的键字段。因此,PATH 类型的辅助 XML 索引对此工作负荷很有用:

复制代码
CREATE XML INDEX idx_xCol_Path on T (xCol) USING XML INDEX idx_xCol FOR PATH

示例:提取对象的属性
例如,下面的查询从表 T 中的各行检索书的属性 genre、title 和 ISBN:

复制代码
SELECT xCol.value ('(/book/@genre)[1]', 'varchar(50)'), xCol.value ('(/book/title/text())[1]', 'varchar(50)'), xCol.value ('(/book/@ISBN)[1]', 'varchar(50)')FROM T

在这种情况下,属性索引很有用,其创建方式如下:

复制代码
CREATE XML INDEX idx_xCol_Property on T (xCol) USING XML INDEX idx_xCol FOR PROPERTY

示例:基于值的查询
在下面的查询中,descendant-or-self (//) 指定部分路径,以便基于 ISBN 值的查找从 VALUE 索引的使用中获益。

复制代码
SELECT xColFROM TWHERE xCol.exist ('//book/@ISBN[. = "0-7356-1588-2"]') = 1

VALUE 索引的创建方式如下:

复制代码
CREATE XML INDEX idx_xCol_Value on T (xCol) USING XML INDEX idx_xCol FOR VALUE

XML 列的全文索引
您能够对 XML 列创建一个全文索引,该索引对 XML 值的内容进行索引,但忽略 XML 标记。属性值不在全文索引范围内,因为他们被视为标记的一部分,并且元素标记被用作标记边界。如有可能,能够按下列方式将全文搜索和 XML 索引结合起来:

首先,使用 SQL 全文搜索筛选感兴趣的 XML 值。


然后,查询那些使用 XML 列的 XML 索引的 XML 值。


示例:将全文搜索和 XML 查询结合起来
XML 列创建了全文索引后,下面的查询将检查 XML 值是否在书的标题中包含“custom”一词:

复制代码
SELECT * FROM T WHERE CONTAINS(xCol,'custom') AND xCol.exist('/book/title/text()[contains(.,"custom")]') =1

contains() 方法使用全文索引来将文档中任何位置包含“custom”一词的 XML 值组合为一个子集。exist() 子句确保“custom”一词出现在书的标题中。

使用 contains() 的全文搜索和 XQuery contains() 具备不同语义。后者是子字符串匹配,前者是使用词干匹配的标记匹配。因此,假如搜索标题中包含“run”的字符串,则匹配结果将包括“run”、“runs”和“running”,因为同时满足全文 contains() 和 Xquery contains()。但是,查询不匹配标题中的“customizable”一词,因为全文 contains() 失败,而满足 Xquery contains()。通常,对于纯子字符串匹配,应删除全文 contains() 子句。

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!