patternsqlMinor
Selective Xml Indexing
Viewed 0 times
indexingselectivexml
Problem
I have recently been researching Selective Xml Indexing and have been trying to figure out how to index a
If I have the below query
I can write a selective Index as below if I am following it right:
Can I include the c.query in the index? Thanks
.query methodIf I have the below 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)I can write a selective Index as below if I am following it right:
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
)
GOCan I include the c.query in the index? Thanks
Solution
A selective index will not be used when using
From Selective XML Indexes (SXI) - Supported XML Features
Selective XML indexes support the XQuery supported by SQL Server
inside the exist(), value() and nodes() methods.
For the query() and modify() methods, selective XML indexes may be
used for node filtering only.
For the query() method, selective XML indexes are not used to retrieve
results.
However testing shows that the index is used when you rewrite the query using nodes. These queries returns the same but the second is faster because it uses the the selective XML index.
The selective XML index used in the second query is defined as..
I used a table of my own just to be able to show what the difference in this case is.
query to retrieve the data.From Selective XML Indexes (SXI) - Supported XML Features
Selective XML indexes support the XQuery supported by SQL Server
inside the exist(), value() and nodes() methods.
For the query() and modify() methods, selective XML indexes may be
used for node filtering only.
For the query() method, selective XML indexes are not used to retrieve
results.
However testing shows that the index is used when you rewrite the query using nodes. These queries returns the same but the second is faster because it uses the the selective XML index.
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)The selective XML index used in the second query is defined as..
[Line] = '/Log/CallStack/ExceptionThread/Line' as XQUERY 'node()',I used a table of my own just to be able to show what the difference in this case is.
(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.Code Snippets
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)[Line] = '/Log/CallStack/ExceptionThread/Line' as XQUERY 'node()',(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.Context
StackExchange Database Administrators Q#41690, answer score: 5
Revisions (0)
No revisions yet.