用于选择性 Xml 索引的 Sql Server 2012 扩展事件未显示结果

Key*_*dly 4 xml sql-server extended-events sql-server-2012

我创建了一个扩展事件来监视和调整 Selective Xml 索引

CREATE EVENT SESSION [SelectiveXmlIndexing] ON SERVER 
ADD EVENT sqlserver.selective_xml_index_no_compatible_sql_type,
ADD EVENT sqlserver.selective_xml_index_no_compatible_xsd_types,
ADD EVENT sqlserver.selective_xml_index_path_not_indexed,
ADD EVENT sqlserver.selective_xml_index_path_not_supported
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF)
GO
Run Code Online (Sandbox Code Playgroud)

在 SSMS 中,当我view live data然后执行xml查询和视图时,没有返回任何结果。

我所看到的是:

在此处输入图片说明

在看到结果之前,我还需要完成其他步骤吗?

我跟着:

http://www.mssqltips.com/sqlservertip/2731/managing-sql-server-extended-events-in-management-studio/

http://www.sqlskills.com/blogs/bobb/choosing-paths-for-selective-xml-index-part-2-using-the-sxi-xevents/

http://www.sqlskills.com/blogs/jonathan/sql-server-2012-extended-events-update-3-viewing-target-data/

编辑,

添加请求的查询和索引

询问

WITH XMLNAMESPACES ( 'http://tempuri.org/tst.xsd' as tst )

SELECT 

    x.XmlId

    ,a.value('@id', 'int') As ColumnA
    ,b.value('.', 'NVARCHAR(25)') ColumnB               

        From
    dbo.XmlTable As X

    Cross Apply x.XmlContent.nodes('tst:Root/tst:Stuff') aa(a)
    Cross Apply a.nodes('tst:Forms') bb(b) 
Run Code Online (Sandbox Code Playgroud)

以及根元素和属性的索引

CREATE SELECTIVE XML INDEX [xsi_XmlTable] ON [dbo].[XmlTable]
(
    [XmlColumn]
)
WITH XMLNAMESPACES
(
DEFAULT 'http://tempuri.org/tst.xsd'
)

FOR
(
[1] = '/Root/Stuff' as XQUERY 'node()', 
[2] = '/Root/Stuff/@id' as SQL [int] SINGLETON 
)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90)
GO  
Run Code Online (Sandbox Code Playgroud)

我最终想为 Forms 元素的元素和 text() 建立索引,但下面会执行,但没有为路径 3 和 4 建立索引。

[1] = '/Root/Stuff' as XQUERY 'node()', 
[2] = '/Root/Stuff/@id' as SQL [int] SINGLETON ,
[3] = '/Root/Forms' as XQUERY 'node()',
[4] = '/Root/Forms/text()' as SQL [nvarchar](25) SINGLETON
Run Code Online (Sandbox Code Playgroud)

编辑:以下也不起作用,因为我包含相同的路径并收到错误

Paths with same path expression indexed with selective XML index 'xsi_XmlTable' should have SINGLETON option either specified for all of them or for none of them.
Run Code Online (Sandbox Code Playgroud)

所以我试图测试如果我删除 Singleton 哪个会更好

[3] = '/Root/Forms' as XQUERY 'node()',
[4] = '/Root/Forms' as SQL [nvarchar](25) SINGLETON
Run Code Online (Sandbox Code Playgroud)

编辑,从下面的查询中删除连接后能够返回一些结果。我不确定为什么连接不允许它返回结果,但只是运行直接的 xquery 我能够返回结果但路径 3 和 4 我仍然没有被索引。

WITH XMLNAMESPACES ( 'http://tempuri.org/tst.xsd' as tst )

    SELECT 

         x.XmlId
        ,c.Content

        ,a.value('@id', 'int') As ColumnA
        ,b.value('.', 'NVARCHAR(25)') ColumnB               

            From
        dbo.XmlTable As X

        Cross Apply x.XmlContent.nodes('tst:Root/tst:Stuff') aa(a)
        Cross Apply a.nodes('tst:Forms') bb(b) 

        Inner Join TableC c on c.id = a.value('@id', 'int')
Run Code Online (Sandbox Code Playgroud)

这是一个简单的 Xml 示例

<tst:Root xmlns:tst="http://tempuri.org/tst.xsd" SchemaVersion="0.1">
  <tst:Stuff id="1">
    <tst:Forms>Sample1</tst:Forms>
  </tst:Stuff>
</tst:Root> 
Run Code Online (Sandbox Code Playgroud)

Mik*_*son 6

不确定您在事件日志中看到和没有看到的内容,但它按我的预期工作(版本 11.0.3000)。

您使用额外路径表达式所犯的错误是您忘记Stuff了路径。

使用扩展事件对此进行测试并查看运算符的执行计划Table Valued Function XML Reader ...(应该没有),我发现一个额外的路径足以让您的查询仅使用索引来获取数据[4] = '/Root/Stuff/Forms' as SQL nvarchar(25)。你也可以[3] = '/Root/Stuff/Forms' as XQUERY 'node()'在那里,也许它会有所不同,这取决于你的 XML 的样子。

注意 1:您混淆了索引和查询中列的名称。这可能会导致您遇到扩展事件的问题。

注 2:在编译查询时会生成缺少选择性 XML 索引的事件。如果从缓存中使用查询计划,您将看不到任何事件。