2017-05-10 60 views
0

首先,我使用了無類型的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 
+2

[Obligatoria Eric Lippert rant](https://ericlippert.com/2012/12/17/performance-rant/)。這就像你要求我們爲你設定一個基準。 –

+0

不,我只是覺得有人已經經歷過類似的問題。 –

+3

性能問題的問題在於確定「類似問題」是什麼。要嵌套的XML有多深?多少行?多少列?根據XML的大小,正確的方法會有所不同嗎?硬件? SQL Server的版本?也許沒有關係。也許一些它。直到你測試你纔會知道。一個恰當的質量答案涵蓋了這個問題「一般」(除了某人只是說「X更快」而沒有任何理由)並不容易,相比之下,只是優化一個特定的案例。 –

回答

0

所以我在25x25矩陣上做了基準測試(由於它的複雜性,它花費了大量的編程來獲取查詢作爲文本)。第二種方法,速度提高2倍。

所以,我想要的結論是:儘可能使用XQuery方法。即使兩種方法之間的差異很小(例如我提供的例子)。

0

通過詢問的幫助Display the Estimated Execution Plan: -

第一種方法: -

其執行計劃的差異部分:

- enter image description here

第二種方法: -

其執行計劃的差異部分:

enter image description here

因此,第一種方法比第一個表現的更好。

+0

這個答案正是我的評論意思。 *估計*執行計劃就是 - 一個*估計*。即使是*實際執行計劃,百分比成本指標也非常不可靠。這只是衡量的第一步。 –