首先,我使用了无类型的XML。其次,我正在使用SQL Server。在SQL中使用XML - 性能
最近我在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
[Obligatoria Eric Lippert rant](https://ericlippert.com/2012/12/17/performance-rant/)。这就像你要求我们为你设定一个基准。 –
不,我只是觉得有人已经经历过类似的问题。 –
性能问题的问题在于确定“类似问题”是什么。要嵌套的XML有多深?多少行?多少列?根据XML的大小,正确的方法会有所不同吗?硬件? SQL Server的版本?也许没有关系。也许一些它。直到你测试你才会知道。一个恰当的质量答案涵盖了这个问题“一般”(除了某人只是说“X更快”而没有任何理由)并不容易,相比之下,只是优化一个特定的案例。 –