在 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 方法。即使两种方法之间的差异很小(如我提供的示例).