Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 производительность xml.query  [new]
пьяный тюлень
Member

Откуда:
Сообщений: 100
Коллеги, есть проблема с производительностью xml-запроса. При попытке вывести атрибут parent-элемента происходит драматическое снижение производительности запроса. В плане выполнения толщине одной стрелки может позавидовать каждый.

declare @xml xml, @s varchar(max)
set @s = 
'<group id="g0"><item a="0" b="a" c="q" /><item a="1" b="b" c="t" /></group>'+
'<group id="g1"><item a="2" b="c" c="w" /><item a="3" b="d" c="y" /></group>'+
'<group id="g2"><item a="4" b="e" c="e" /><item a="5" b="f" c="u" /></group>'+
'<group id="g3"><item a="6" b="g" c="r" /><item a="7" b="h" c="i" /></group>'
select top 8 @s = @s + @s from sys.objects
set @xml = '<root>' + @s + '</root>'

print 'Without parent'
set nocount on
set statistics time on
select
	--t.a.value('../@id','varchar(255)') as ParentID,
	t.a.value('@a','varchar(255)') as A,
	t.a.value('@b','varchar(255)') as B,
	t.a.value('@c','varchar(255)') as C
from (select @xml.query('/root/group') q) q
cross apply q.nodes('/group/item') as t(a)
set statistics time off

print char(10)+'With parent'
set statistics time on
select
	t.a.value('../@id','varchar(255)') as ParentID,
	t.a.value('@a','varchar(255)') as A,
	t.a.value('@b','varchar(255)') as B,
	t.a.value('@c','varchar(255)') as C
from (select @xml.query('/root/group') q) q
cross apply q.nodes('/group/item') as t(a)
set statistics time off

Есть ли какой-нибудь способ доставать значение из parent-элемента за меньшее количество времени?

К сообщению приложен файл. Размер - 84Kb
3 фев 14, 18:11    [15512163]     Ответить | Цитировать Сообщить модератору
 Re: производительность xml.query  [new]
invm
Member

Откуда: Москва
Сообщений: 9413
print char(10)+'With parent'
set statistics time on

select
	t.a.value('@id','varchar(255)') as ParentID,
	y.n.value('@a','varchar(255)') as A,
	y.n.value('@b','varchar(255)') as B,
	y.n.value('@c','varchar(255)') as C
from 
 @xml.nodes('root/group') as t(a) cross apply
 (select t.a.query('item')) x(i) cross apply
 x.i.nodes('item') y(n)

set statistics time off
3 фев 14, 19:13    [15512518]     Ответить | Цитировать Сообщить модератору
 Re: производительность xml.query  [new]
пьяный тюлень
Member

Откуда:
Сообщений: 100
invm,

Пламенное спасибо, добрый человек. =)
3 фев 14, 20:37    [15512777]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить