用於選擇性 Xml 索引的 Sql Server 2012 擴展事件未顯示結果
我創建了一個擴展事件來監視和調整選擇性 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/
編輯,
添加請求的查詢和索引
詢問
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 索引的事件。如果從記憶體中使用查詢計劃,您將看不到任何事件。