First of all, I am using untyped XML. Secondly, I am using SQL Server.
Recently I got familiar with XML in SQL and have one question: which of presented approaches is better in terms of performance (in this example the difference would negligible, but I'm asking generally)?
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
So i have done benchmark on 25x25 matrix (it took lot of programming to get the query as text because of its complexity). Second approach it's 2 times faster.
So conclusion (which I wanted) is: it's better to use XQuery methods, when possible. Even when the difference between two approaches is very little (like in example I provided).