首先,我使用了無類型的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更快」而沒有任何理由)並不容易,相比之下,只是優化一個特定的案例。 –