XML 列的第一个索引是主 XML 索引。使用它时,可以对 XML 列创建三种类型的辅助 XML 索引,以提供常见种类的查询的速度,如以下部分所述。
主 XML 索引
这将对 XML 列中 XML 实例的所有标记、值和路径进行索引。基表(即包含 XML 列的表)的主键必须具有聚集索引。主键用于将索引行与基表中的行相关联。可从 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 值。