选择性 Xml 索引

Key*_*dly 5 sql-server sql-server-2012

我最近一直在研究 Selective Xml Indexing 并一直试图弄清楚如何索引一个.query方法

如果我有以下查询

WITH XMLNAMESPACES (Default 'http://www.w3.org/2001/XMLSchema' )
SELECT 

    ,a.value('@Number' , 'INT') As Number
    ,c.query('.') as FormattedXml

    From

    dbo.XmlTable As X

    Cross Apply x.XmlColumn.nodes('Root') aa(a) 
    Cross Apply a.nodes('Block') bb(b)
Run Code Online (Sandbox Code Playgroud)

如果我正确地遵循它,我可以编写如下的选择性索引:

CREATE SELECTIVE XML INDEX xsi_XmlTable
ON dbo.XmlTable( XmlColumn )
WITH XMLNAMESPACES ( Default 'http://www.w3.org/2001/XMLSchema' )
FOR
(
      root = '/Root' AS XQUERY 'node()'
    , rootNumber = '/Root/@Number' AS SQL INT SINGLETON

)
GO
Run Code Online (Sandbox Code Playgroud)

我可以在索引中包含 c.query 吗?谢谢

Mik*_*son 5

用于query检索数据时将不使用选择性索引。

来自选择性 XML 索引 (SXI) - 支持的 XML 功能

选择性 XML 索引在exist()、value() 和nodes() 方法中支持SQL Server 支持的XQuery。

对于 query() 和 modify() 方法,选择性 XML 索引可能仅用于节点过滤。

对于 query() 方法,不使用选择性 XML 索引来检索结果。

但是测试表明,当您使用节点重写查询时会使用索引。这些查询返回相同但第二个更快,因为它使用选择性 XML 索引。

select data.query('/Log/CallStack/ExceptionThread/Line')
from LogData


select T.X.query('.')
from LogData
  cross apply data.nodes('/Log/CallStack/ExceptionThread/Line') as T(X)
Run Code Online (Sandbox Code Playgroud)

第二个查询中使用的选择性 XML 索引定义为..

[Line] = '/Log/CallStack/ExceptionThread/Line' as XQUERY 'node()', 
Run Code Online (Sandbox Code Playgroud)

我使用了我自己的一张表格来展示这种情况下的不同之处。

(67992 row(s) affected)
Table 'LogData'. Scan count 1, logical reads 388, physical reads 0, read-ahead reads 0, lob logical reads 1840865, lob physical reads 313514, lob read-ahead reads 24.

 SQL Server Execution Times:
   CPU time = 129792 ms,  elapsed time = 180087 ms.

(1850106 row(s) affected)
Table 'xml_sxi_table_622625261_256000'. Scan count 1, logical reads 8416, physical reads 3, read-ahead reads 8403, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'LogData'. Scan count 1, logical reads 388, physical reads 0, read-ahead reads 0, lob logical reads 927882, lob physical reads 0, lob read-ahead reads 24.

 SQL Server Execution Times:
   CPU time = 65271 ms,  elapsed time = 67636 ms.
Run Code Online (Sandbox Code Playgroud)