选择性 XML 索引 (SXI)
适用于:SQL Server Azure SQL 数据库 Azure SQL 托管实例
选择性 XML 索引是除了普通 XML 索引之外可供您使用的另外一种 XML 索引类型。 选择性 XML 索引功能的目标如下:
改进对 SQL Server 中所存储 XML 数据的查询性能。
支持更快速地对较大的 XML 数据工作负荷建立索引。
通过减少 XML 索引的存储成本提高可伸缩性。
普通 XML 索引的主要限制是要对整个 XML 文档建立索引。 这导致了主要与索引的存储成本相关的几大缺点,例如降低了查询性能和增加了索引维护成本。
通过选择性 XML 索引功能,您可以从要建立索引的 XML 文档仅提升某些路径。 在创建索引时,将对这些路径进行评估,这些路径所指向的节点将被拆分并存储于 SQL Server 中的关系表内。 该功能采用了 Microsoft Research 与 SQL Server 产品团队合作开发的高效映射算法。 该算法将 XML 节点映射到单个关系表,实现了不同凡响的性能且只要求有限的存储空间。
该选择性 XML 索引功能还支持针对已按选择性 XML 索引建立索引的节点的辅助选择性 XML 索引。 这些辅助选择性索引是高效的并且进一步改进了查询性能。
选择性 XML 索引的优点
选择性 XML 索引具有下列优点:
极大改进了针对典型查询负荷的 XML 数据类型的查询性能。
与普通 XML 索引相比,降低了存储要求。
与普通 XML 索引相比,降低了索引维护成本。
无需更新应用程序即可享有选择性 XML 索引所带来的好处。
选择性 XML 索引和主 XML 索引
重要
在大多数情况下,通过创建选择性 XML 索引而不是普通 XML 索引,可以改善性能和提高存储效率。
但在以下任意一个条件成立时,不推荐使用选择性 XML 索引:
您要映射大量节点路径。
您要为未知元素或文档结构内未知位置中的元素支持查询。
选择性 XML 索引示例
请将下面的 XML 片段视为由大约 500,000 行构成的表中的一个 XML 文档:
<book>
<created>2004-03-01</created>
<authors>Various</authors>
<subjects>
<subject>English wit and humor -- Periodicals</subject>
<subject>AP</subject>
</subjects>
<title>Punch, or the London Charivari, Volume 156, April 2, 1919</title>
<id>etext11617</id>
</book>
对由这么多行构成的这个简单架构创建主 XML 索引会用较长的时间。 对此数据进行查询还面临这样一个问题,即主 XML 索引不支持选择性索引。
如果您仅需要对 /book/title
路径和 /book/subjects
路径查询此数据,则可以创建以下选择性 XML 索引:
CREATE SELECTIVE XML INDEX SXI_index
ON Tbl(xmlcol)
FOR
(
pathTitle = '/book/title/text()' AS XQUERY 'xs:string',
pathAuthors = '/book/authors' AS XQUERY 'node()',
pathId = '/book/id' AS SQL NVARCHAR(100)
);
前面的语句是您在创建选择性 XML 索引时使用的 CREATE 语法的一个很好的例子。 在 CREATE 语句中,您首先为索引提供名称,并且标识要建立索引的表和 XML 列。 然后,您提供要建立索引的路径。 一个路径由三个部分构成:
唯一标识该路径的名称。
描述该路径的 XQuery 表达式。
可选的优化提示。
有关这些元素的详细信息,请参阅 相关任务。
支持的功能、先决条件和限制
支持的 XML 功能
选择性 XML 索引在 exist()
、value()
和 nodes()
方法内支持 SQL Server 所支持的 XQuery。
对于
exist()
、value()
和nodes()
方法,选择性 XML 索引包含用于转换整个表达式的足够信息。对于
query()
和modify()
方法,选择性 XML 索引只能用于节点筛选。对于
query()
方法,选择性 XML 索引不用于检索结果。对于
modify()
方法,选择性 XML 索引不用于更新 XML 文档。
不支持的 XML 功能
选择性 XML 索引不支持在 XML 的 SQL Server 实现中支持的以下功能:
对具有复杂 XS 类型的节点建立索引:联合类型、序列类型和列表类型。
对具有二进制 XS 类型的节点建立索引:例如 base64Binary 和 hexBinary。
使用在末尾包含通配符
*
的 XPath 表达式指定要建立索引的节点:例如/a/b/c/*
、/a//b/*
或/a/b/*:c
。对子级、属性或后代以外的任何轴建立索引。
//<step>
的情况允许作为特例。对 XML 处理指令和注释建立索引。
通过使用 id() 函数为节点指定和检索标识符。
先决条件
必须首先满足以下先决条件,然后才能对用户表中的 XML 列创建选择性 XML 索引:
聚集索引必须存在于用户表的主键上。
在用于选择性 XML 索引时,用户表的主键限制为 128 字节大小。
在用于选择性 XML 索引时,用户表的聚集键限制为 15 列。
限制
一般要求和限制
- 只能对单个 XML 列创建各个选择性 XML 索引
- 不能对非 XML 列创建选择性 XML 索引
- 表中的每个 XML 列只能具有一个选择性 XML 索引
- 每个表最多可具有 249 个选择性 XML 索引。
对支持的对象的限制
不能对以下对象创建选择性 XML 索引:
- 视图中的 XML 列
- 具有 XML 列的表值变量
- XML 类型变量
- 计算出的 XML 列
- 深度超过 128 个嵌套节点的 XML 列。
存储限制
对于可添加到索引中的 XML 文档中的节点数有一定的限制。 选择性 XML 索引将 XML 文档映射到单个关系表。 因此,在表的任何给定行中,选择性 XML 索引不能具有超过 1024 个非 Null 列。 此外,针对稀疏列的许多限制也适用于选择性 XML 索引,因为这些索引使用稀疏列来进行存储。
在任何给定行中支持的非 Null 列的最大数目依赖于列中的数据大小:
在最佳情形下,在所有列的类型均为 bit时支持 1024 个非 Null 列。
在最差情形下,在所有列均为 varchar类型的大型对象时仅支持 236 个非 Null 列。
选择性 XML 索引为建立索引的每个节点路径在内部使用一到四个列。 可建立索引的节点总数从 60 个节点到几百个节点不等,具体数目取决于已建立索引的路径中数据的实际大小。
在最差情形下,在节点路径定义中使用
//
映射某些或所有节点时,已建立索引的节点的最大数目是 60。在最佳情形下,在节点路径定义中未使用
//
映射节点时,已建立索引的节点的最大数目是 200。
在执行 CREATE 或 ALTER 索引操作时,选择性 XML 索引将会重新生成
在您使用 CREATE 或 ALTER 语句对选择性 XML 索引执行操作时,将在单线程的脱机模式下重新生成该索引。 频繁使用 ALTER 语句会对针对已建立索引的 XML 文档执行的查询的性能造成负面影响。
其他限制
在查询提示中不支持选择性 XML 索引。
在数据库优化顾问中不支持选择性 XML 索引和辅助选择性 XML 索引。