2017-05-10 31 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

这个答案正是我的评论意思。 *估计*执行计划就是 - 一个*估计*。即使是*实际执行计划,百分比成本指标也非常不可靠。这只是衡量的第一步。 –