Sql-Server

用於選擇性 Xml 索引的 Sql Server 2012 擴展事件未顯示結果

  • July 9, 2013

我創建了一個擴展事件來監視和調整選擇性 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

在 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) 

根元素和屬性的索引

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  

我最終想為 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

編輯:以下內容也不起作用,因為我包含相同的路徑並收到錯誤

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.

所以我正在嘗試測試如果我刪除 Singleton 哪個會更好

[3] = '/Root/Forms' as XQUERY 'node()',
[4] = '/Root/Forms' as SQL [nvarchar](25) SINGLETON

編輯,在從以下查詢中刪除連接後能夠返回一些結果。我不確定為什麼加入不允許它返回結果,但只是執行直接 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')

這是一個簡單的 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> 

不確定您在事件日誌中看到和未看到的內容,但它對我來說按預期工作(版本 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 索引的事件。如果從記憶體中使用查詢計劃,您將看不到任何事件。

引用自:https://dba.stackexchange.com/questions/45952