在 SQL 中使用 XML — 性能
Using XML in SQL — performance
首先,我使用的是无类型XML。
其次,我正在使用 SQL 服务器。
最近我熟悉了 SQL 中的 XML 并有一个问题:所提出的方法中哪种在性能方面更好(在这个例子中,差异可以忽略不计,但我想问一般来说)?
declare @t table(c1 int, c2 int, c3 int)
declare @xml xml
set @xml = '<matrix>
<row>
<col>1</col>
<col>2</col>
<col>3</col>
</row>
<row>
<col>4</col>
<col>5</col>
<col>6</col>
</row>
<row>
<col>7</col>
<col>8</col>
<col>9</col>
</row>
</matrix>'
-- FIRST APPROACH
insert into @t values
(@xml.value('(/matrix[1]/row[1]/col)[1]','int'), @xml.value('(/matrix[1]/row[2]/col)[1]','int'),@xml.value('(/matrix[1]/row[3]/col)[1]','int')),
(@xml.value('(/matrix[1]/row[1]/col)[2]','int'),@xml.value('(/matrix[1]/row[2]/col)[2]','int'), @xml.value('(/matrix[1]/row[3]/col)[2]','int')),
(@xml.value('(/matrix[1]/row[1]/col)[3]','int'), @xml.value('(/matrix[1]/row[2]/col)[3]','int'), @xml.value('(/matrix[1]/row[3]/col)[3]','int'))
select * from @t
delete from @t
-- SECOND APPROACH
insert into @t (c1,c2,c3)
select c.value('(./row[1]/col)[1]','int'), c.value('(./row[2]/col)[1]','int'), c.value('(./row[3]/col)[1]','int')
from @xml.nodes('/matrix') as T(c)
insert into @t (c1,c2,c3)
select c.value('(./row[1]/col)[2]','int'), c.value('(./row[2]/col)[2]','int'), c.value('(./row[3]/col)[2]','int')
from @xml.nodes('/matrix') as T(c)
insert into @t (c1,c2,c3)
select c.value('(./row[1]/col)[3]','int'), c.value('(./row[2]/col)[3]','int'), c.value('(./row[3]/col)[3]','int')
from @xml.nodes('/matrix') as T(c)
select * from @t
向 Display the Estimated Execution Plan 寻求帮助:-
第一种方法:-
其执行计划的不同部分:
-
第二种方法:-
其执行计划的不同部分:
因此,第一种方法在性能上优于第一种方法。
所以我已经完成了 25x25 矩阵的基准测试(由于其复杂性,需要大量编程才能将查询作为文本获取)。第二种方法快 2 倍。
所以结论(我想要的)是:最好尽可能使用 XQuery 方法。即使两种方法之间的差异很小(如我提供的示例).
首先,我使用的是无类型XML。 其次,我正在使用 SQL 服务器。
最近我熟悉了 SQL 中的 XML 并有一个问题:所提出的方法中哪种在性能方面更好(在这个例子中,差异可以忽略不计,但我想问一般来说)?
declare @t table(c1 int, c2 int, c3 int)
declare @xml xml
set @xml = '<matrix>
<row>
<col>1</col>
<col>2</col>
<col>3</col>
</row>
<row>
<col>4</col>
<col>5</col>
<col>6</col>
</row>
<row>
<col>7</col>
<col>8</col>
<col>9</col>
</row>
</matrix>'
-- FIRST APPROACH
insert into @t values
(@xml.value('(/matrix[1]/row[1]/col)[1]','int'), @xml.value('(/matrix[1]/row[2]/col)[1]','int'),@xml.value('(/matrix[1]/row[3]/col)[1]','int')),
(@xml.value('(/matrix[1]/row[1]/col)[2]','int'),@xml.value('(/matrix[1]/row[2]/col)[2]','int'), @xml.value('(/matrix[1]/row[3]/col)[2]','int')),
(@xml.value('(/matrix[1]/row[1]/col)[3]','int'), @xml.value('(/matrix[1]/row[2]/col)[3]','int'), @xml.value('(/matrix[1]/row[3]/col)[3]','int'))
select * from @t
delete from @t
-- SECOND APPROACH
insert into @t (c1,c2,c3)
select c.value('(./row[1]/col)[1]','int'), c.value('(./row[2]/col)[1]','int'), c.value('(./row[3]/col)[1]','int')
from @xml.nodes('/matrix') as T(c)
insert into @t (c1,c2,c3)
select c.value('(./row[1]/col)[2]','int'), c.value('(./row[2]/col)[2]','int'), c.value('(./row[3]/col)[2]','int')
from @xml.nodes('/matrix') as T(c)
insert into @t (c1,c2,c3)
select c.value('(./row[1]/col)[3]','int'), c.value('(./row[2]/col)[3]','int'), c.value('(./row[3]/col)[3]','int')
from @xml.nodes('/matrix') as T(c)
select * from @t
向 Display the Estimated Execution Plan 寻求帮助:-
第一种方法:-
其执行计划的不同部分:
-
第二种方法:-
其执行计划的不同部分:
因此,第一种方法在性能上优于第一种方法。
所以我已经完成了 25x25 矩阵的基准测试(由于其复杂性,需要大量编程才能将查询作为文本获取)。第二种方法快 2 倍。
所以结论(我想要的)是:最好尽可能使用 XQuery 方法。即使两种方法之间的差异很小(如我提供的示例).