主 XML 索引

主 XML 索引对 XML 列中 XML 实例内的所有标记、值和路径进行索引。若要创建主 XML 索引,相应 XML 列所在的表必须对该表的主键创建了聚集索引。SQL Server 使用此主键将主 XML 索引中的行与包含此 XML 列的表中的行关联起来。

主 XML 索引是 xml 数据类型列中的 XML BLOB 的已拆分和持久的表示形式。对于列中的每个 XML 二进制大型对象 (BLOB),索引将创建数个数据行。该索引中的行数大约等于 XML 二进制大型对象中的节点数。当查询检索完整的 XML 实例时,SQL Server 会提供此 XML 列中的实例。XML 实例中的查询使用主 XML 索引,并可以通过使用索引本身返回标量值或 XML 子树。

每行存储以下节点信息:

  • 标记名(如元素名称或属性名称)。

  • 节点值。

  • 节点类型(如元素节点、属性节点或文本节点)。

  • 文档顺序信息(由内部节点标识符表示)。

  • 从每个节点到 XML 树的根的路径。搜索此列可获得查询中的路径表达式。

  • 基表的主键。基表的主键将复制到主 XML 索引中,用于向后和基表进行联接,并且基表的主键中的最大列数限制为 15。

此节点信息用于计算和构造指定查询的 XML 结果。出于优化的需要,标记名和节点类型信息编码为整数值,且 Path 列使用同样的编码。另外,路径以相反的顺序存储,以便在仅知道路径后缀的情况下能够匹配路径。例如:

  • //ContactRecord/PhoneNumber,其中只有最后两个步骤是已知的

  • /Book/*/Title,其中通配符 (*) 是在表达式中间指定的。

对于涉及 XML 数据类型方法的查询,查询处理器使用主 XML 索引,并返回主索引自身中的标量值或 XML 子树。(此索引存储重新构造 XML 实例所需的所有信息。)

例如,以下查询将返回 ProductModel 表的 CatalogDescriptionxml 类型列中存储的摘要信息。只有当产品型号的目录说明中还存储 <Features> 说明时,该查询才会返回 <Summary> 信息。

WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2008/07/adventure-works2008R2/ProductModelDescription' AS "PD")

SELECT CatalogDescription.query('
  /PD:ProductDescription/PD:Summary
') as Result
FROM Production.ProductModel
WHERE CatalogDescription.exist ('/PD:ProductDescription/PD:Features') = 1

关于主 XML 索引,为 exist() 方法中指定的表达式按顺序搜索与每个 XML 二进制大型对象相对应的索引中的行,而不是拆分基表中的每个 XML 二进制大型对象实例。如果路径是在索引中的 Path 列中找到的,则从主 XML 索引检索 <Summary> 元素及其子树,并将它们转换为 XML 二进制大型对象以作为 query() 方法的结果。

注意,检索完整的 XML 实例时不使用主 XML 索引。例如,下面的查询从表中检索描述了特定产品型号的生产说明的整个 XML 实例。

USE AdventureWorks2008R2;

SELECT Instructions
FROM Production.ProductModel 
WHERE ProductModelID=7;

请参阅

概念