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

Откуда: Прага
Сообщений: 247
День добрый!

Есть такая udf:

ALTER FUNCTION [dbo].[udf_GetLocalizedText](@xml xml,@locale nvarchar(5))
RETURNS nvarchar(max)
WITH RETURNS NULL ON NULL INPUT 
BEGIN 

	return ISNULL(ISNULL(@xml.value('/ml[1]/locale[@name=sql:variable("@locale")][1]','nvarchar(max)'),@xml.value('/ml[1]/locale[@name="en-US"][1]','nvarchar(max)')),N'[N/A in '''+@locale+N''']')

END


Она вытаскивает из xml типа
<ml><locale name="en-US">eng</locale><locale name="ru-RU">рус</locale></ml>


значение в нужном языке.

Функция используется везде и естественно в больших запросах начинает тормозить.
Тормоза хочется убрать следующим образом:
1)попробовать оптимизировать xml запрос в функции и посмотреть на результат, если будет ОК, то так всё и оставить.
2)оптимизировать xml запрос и отказаться от функции, заменив постепенно все ее вызовы на инлайн запрос.

Есть идеи как можно ускорить запрос, приведенный выше?
30 окт 13, 12:59    [15052011]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить парсинг xml  [new]
Hooly-Gun
Member

Откуда:
Сообщений: 16
cavalero,
XML/ XMLи.... загрузить / распарсить в реляционные таблицы
потом юзать?..
30 окт 13, 13:08    [15052105]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить парсинг xml  [new]
cavalero
Member

Откуда: Прага
Сообщений: 247
Hooly-Gun
cavalero,
XML/ XMLи.... загрузить / распарсить в реляционные таблицы
потом юзать?..


Частично так делаю, для запросов крайне критичных ко времени выполнения. Но больно уж много мест где используется xml.

В прицнипе только избавление от udf дает почти двукратное уменьшение времени обработки запроса, что уже ОК.

Если еще его немного оптимизировать, то будет вообще замечательно. Но моих познаний в SQL уже не хватает, чтобы сделать его еще быстрее.
30 окт 13, 13:15    [15052164]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить парсинг xml  [new]
Hooly-Gun
Member

Откуда:
Сообщений: 16
оптимизировать функцию которая дергается для каждой записи, имхо не вариант
что мешает загрузить данные из XML в БД?
30 окт 13, 13:31    [15052308]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить парсинг xml  [new]
cavalero
Member

Откуда: Прага
Сообщений: 247
Hooly-Gun
оптимизировать функцию которая дергается для каждой записи, имхо не вариант
что мешает загрузить данные из XML в БД?


Если честно, то объем необходимых изменений. Около 200 таблиц с xml, около 800 хранимок, которые необходимо переписать.
Поэтому пока идея довольствоваться принципом минимальной достаточности - оптимизировать запрос

ISNULL(ISNULL(@xml.value('/ml[1]/locale[@name=sql:variable("@locale")][1]','nvarchar(max)'),@xml.value('/ml[1]/locale[@name="en-US"][1]','nvarchar(max)')),N'[N/A in '''+@locale+N''']') 

и заменить им вызов udf.

Как разработчик я понимаю, что правильно - вести для каждой таблицы с xml доп таблицу с языковыми мутациями, но объективно понимаю, что это очень ёмкое по времени решение.
30 окт 13, 13:59    [15052499]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить парсинг xml  [new]
Jaffar
Member

Откуда:
Сообщений: 633
Hooly-Gun,

наверное то, что эта функция уже используется в 100500 местах кода и переписывать его весь не охота.
30 окт 13, 14:01    [15052515]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить парсинг xml  [new]
Jaffar
Member

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

--- под рукой нет ms sql 
--- поробуйте так:
isNULL(
case when @xml like '%<locale name="'+@locate+'">%' then @xml.value('/ml[1]/locale[@name=sql:variable("@locale")][1]','nvarchar(max)')
     when @xml like '%<locale name="en-US">%'       then @xml.value('/ml[1]/locale[@name=sql:variable("@locale")][1]','nvarchar(max)') end, N'[N/A in '''+@locale+N''']')
--- будет быстрее в том случае если заданного языка там нет
--- и парсинг xml будет выполняться только если в строке есть нужный язык.
--- но для варианта если нужный язык есть  - будет медленнее т.к. будет выполняться еще и LIKE


--- ВАРИАНТ 2 можно попробовать выдрать substring`ом
declare @x1 int, @x2 int
select @x1 = charindex('<locale name="'+@locate+'">', @xml, 1)
select @x1 = case when @x1 = > 0 then @x1 else charindex('<locale name="en-US">', @xml, 1) end 
if(@x1 > 0)  select @x2 = charindex('</locale>', @xml, @x1+21)

return case when @x1 > 0 and @x2 > @x1 then substring(@xml, @x1+21, @x2 - @x1 - 21) else N'[N/A in '''+@locale+N''']' end
30 окт 13, 14:36    [15052828]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить парсинг xml  [new]
Сон Веры Павловны
Member

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

сделайте функцию детерминированной:
alter FUNCTION [dbo].[udf_GetLocalizedText](@xml xml,@locale nvarchar(5))
RETURNS nvarchar(max)
WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT
....
30 окт 13, 14:40    [15052870]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить парсинг xml  [new]
Jaffar
Member

Откуда:
Сообщений: 633
Сон Веры Павловны
cavalero,

сделайте функцию детерминированной:
alter FUNCTION [dbo].[udf_GetLocalizedText](@xml xml,@locale nvarchar(5))
RETURNS nvarchar(max)
WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT
....


я так понял что проблема не в "накладных" расходах при вызове функции а именно в самом запросе

@xml.value('/ml[1]/locale[@name=sql:variable("@locale")][1]','nvarchar(max)')


типа даже он медленно сам по себе медленно работает.
30 окт 13, 14:51    [15053008]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить парсинг xml  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
cavalero
Если честно, то объем необходимых изменений. Около 200 таблиц с xml, около 800 хранимок, которые необходимо переписать.

Умный выйдет из любой безвыходной ситуации, мудрый в неё не попадёт.
А вот чья-то *опа явно искала приключений, с этим "весёлым" XML, и вот результат.

cavalero
... но объективно понимаю, что это очень ёмкое по времени решение.
Ну на самом деле субъективно. Не так страшен чёрт ...
Надо просто подумать что и как это делать. Главное понять что "в лоб" никогда не работает, а не использовать его "как всегда".
Вы про представления слышали? А про тулзы для рефакторинга?

Ну а главное, тормозит у вас же не везде:
cavalero
... в больших запросах начинает тормозить.
А новый и старый механизмы могут нормально сосуществовать.

Но чувствую, что кто-то даже не возмётся, это же "так вломы" ...
30 окт 13, 15:03    [15053141]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить парсинг xml  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6201
Jaffar
я так понял что проблема не в "накладных" расходах при вызове функции а именно в самом запросе

Тем не менее, детерминированные функции, в отличие от недетерминированных, выызваются один раз на один набор входных параметров. И, кроме того, с детерминированными функциями оптимизатор увереннее выстривает план, без лишних спулов и прочего.
Если выполнить вот такое:
declare
  @xdata xml;
select @xdata=v.x from (
  select * from (
  select
    1 tag, null parent, null [ml!1!],
    null [locale!2!name],
    null [locale!2!!ELEMENT]
  union all
  select
    2 tag, 1 parent, null,
    case number when 1 then 'en-US' else 'ru-RU' end,
    case number when 1 then 'eng' else 'рус' end
  from master..spt_values where type='P' and number between 1 and 2
  )v1
  for xml explicit, type
) v(x);
;with cte as (
  select @xdata x from sys.all_objects
)
select dbo.udf_GetLocalizedText(x, 'eng') from cte;

(у меня в sys.all_objects ~180 тыс. записей), то разница во времени выполнения будет видна невооруженным глазом - в моем случае это ~3 сек. при schemabinding, и 40 без него. Далее, если на запрос натравить профайлер с отслеживанием ивента SP:StmtCompleted (только размер "размножающей" выборки, дабы не генерить огромный трейс, я уменьшил до 2 тысяч), то видно, что в случае со schemabinding SP:StmtCompleted попадает в трейс 1 раз, без schemabinding - на каждую запись размножающей выборки.
30 окт 13, 15:26    [15053379]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить парсинг xml  [new]
Hooly-Gun
Member

Откуда:
Сообщений: 16
Jaffar
Hooly-Gun,

наверное то, что эта функция уже используется в 100500 местах кода и переписывать его весь не охота.


ну весь код переписывать не нужно, переписать запросы работающие на больших объемах все равно, рано
или поздно потребуется
, раз звоночки уже пошли.. может их всего то процентов 5 от общей массы.
Тем более есть возможность, раз есть время на идеи по оптимизации.
30 окт 13, 16:03    [15053785]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить парсинг xml  [new]
cavalero
Member

Откуда: Прага
Сообщений: 247
Jaffar
cavalero,

--- под рукой нет ms sql 
--- поробуйте так:
isNULL(
case when @xml like '%<locale name="'+@locate+'">%' then @xml.value('/ml[1]/locale[@name=sql:variable("@locale")][1]','nvarchar(max)')
     when @xml like '%<locale name="en-US">%'       then @xml.value('/ml[1]/locale[@name=sql:variable("@locale")][1]','nvarchar(max)') end, N'[N/A in '''+@locale+N''']')
--- будет быстрее в том случае если заданного языка там нет
--- и парсинг xml будет выполняться только если в строке есть нужный язык.
--- но для варианта если нужный язык есть  - будет медленнее т.к. будет выполняться еще и LIKE


--- ВАРИАНТ 2 можно попробовать выдрать substring`ом
declare @x1 int, @x2 int
select @x1 = charindex('<locale name="'+@locate+'">', @xml, 1)
select @x1 = case when @x1 = > 0 then @x1 else charindex('<locale name="en-US">', @xml, 1) end 
if(@x1 > 0)  select @x2 = charindex('</locale>', @xml, @x1+21)

return case when @x1 > 0 and @x2 > @x1 then substring(@xml, @x1+21, @x2 - @x1 - 21) else N'[N/A in '''+@locale+N''']' end




Второй вариант - очень удачный. Я давно думал работу c xml в этом случае свести к стринговым операциям, но как-то руки не доходили. Время тестовой выборки 12 xml столбцов * 1500 строк уменьшилось с 5 сек до 0-1 сек.
Единственная проблема алгоритма - пустые теги типа <locale name="ru-RU"/>, операция @txt=convert(nvarchar(max),@xml) оставляет пустые теги без закрывающего. if-ов добавлять не хочется.

В прицнипе, я этот алгоритм года 3 назад стянул из американского aspdotnetstorefront, и 3 года решение работало. Сейчас клиенты и их базы выросли, будем мигрировать на что-то более быстрое.

Однако, парсить строки, как временное решение, я считаю очень удачным, камраду Jaffar респект и уважуха.
30 окт 13, 16:31    [15054056]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить парсинг xml  [new]
cavalero
Member

Откуда: Прага
Сообщений: 247
Сон Веры Павловны
Jaffar
я так понял что проблема не в "накладных" расходах при вызове функции а именно в самом запросе

Тем не менее, детерминированные функции, в отличие от недетерминированных, выызваются один раз на один набор входных параметров. И, кроме того, с детерминированными функциями оптимизатор увереннее выстривает план, без лишних спулов и прочего.
Если выполнить вот такое:
declare
  @xdata xml;
select @xdata=v.x from (
  select * from (
  select
    1 tag, null parent, null [ml!1!],
    null [locale!2!name],
    null [locale!2!!ELEMENT]
  union all
  select
    2 tag, 1 parent, null,
    case number when 1 then 'en-US' else 'ru-RU' end,
    case number when 1 then 'eng' else 'рус' end
  from master..spt_values where type='P' and number between 1 and 2
  )v1
  for xml explicit, type
) v(x);
;with cte as (
  select @xdata x from sys.all_objects
)
select dbo.udf_GetLocalizedText(x, 'eng') from cte;

(у меня в sys.all_objects ~180 тыс. записей), то разница во времени выполнения будет видна невооруженным глазом - в моем случае это ~3 сек. при schemabinding, и 40 без него. Далее, если на запрос натравить профайлер с отслеживанием ивента SP:StmtCompleted (только размер "размножающей" выборки, дабы не генерить огромный трейс, я уменьшил до 2 тысяч), то видно, что в случае со schemabinding SP:StmtCompleted попадает в трейс 1 раз, без schemabinding - на каждую запись размножающей выборки.


Финальный вариант со строковыми операциями никак не реагирует на опцию schemabinding. Попробуйте:

ALTER FUNCTION [dbo].[udf_GetLocalizedText](@xml xml,@locale nvarchar(5))
RETURNS nvarchar(max)
WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT 
BEGIN 

--	return ISNULL(ISNULL(@xml.value('/ml[1]/locale[@name=sql:variable("@locale")][1]','nvarchar(max)'),@xml.value('/ml[1]/locale[@name="en-US"][1]','nvarchar(max)')),N'[N/A in '''+@locale+N''']')
	declare @x1 int, @x2 int, @res nvarchar(max)
	SELECT @res = convert(nvarchar(max), @xml) 
	SELECT @res =  replace(@res,'/>','></locale>')

	SELECT @x1 = charindex('<locale name="'+@locale+'">', @res, 1)

	SELECT @x1 = 
				case 
					when @x1 >  0 then @x1 
					else charindex('<locale name="en-US">', @res, 1) 
				end 


	if(@x1 > 0)
	begin
		SELECT @x2 = charindex('</locale>', @res, @x1+21)
	end	

	return 
			case 
				when @x1 > 0 and @x2 > @x1 then substring(@res, @x1+21, @x2 - @x1 - 21) 
				else N'[N/A in '''+@locale+N''']' 
			end


END
30 окт 13, 17:05    [15054381]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить парсинг xml  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
cavalero
Я давно думал работу c xml в этом случае свести к стринговым операциям, но как-то руки не доходили.
Угу, всё что угодно, лишь бы нормально не делать ...

"Соображалка у наших есть, а вот думалка еще не появилась" © Задорнов
30 окт 13, 17:12    [15054455]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить парсинг xml  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31962
cavalero,

Переделайте в инлайн-функцию. У меня получилось в 100 раз быстрее.

ALTER FUNCTION [dbo].[udf_GetLocalizedTextI](@xml xml,@locale nvarchar(5))
RETURNS TABLE
RETURN SELECT ISNULL(ISNULL(@xml.value('/ml[1]/locale[@name=sql:variable("@locale")][1]','nvarchar(max)'),@xml.value('/ml[1]/locale[@name="en-US"][1]','nvarchar(max)')),N'[N/A in '''+@locale+N''']') as Y
go
declare
  @xdata xml;
select @xdata=v.x from (
  select * from (
  select
    1 tag, null parent, //null [ml!1!],
    null [locale!2!name],
    null [locale!2!!ELEMENT]
  union all
  select
    2 tag, 1 parent, null,
    case number when 1 then 'en-US' else 'ru-RU' end,
    case number when 1 then 'eng' else 'рус' end
  from master..spt_values where type='P' and number between 1 and 2
  )v1
  for xml explicit, type
) v(x);
;with cte as (
  select @xdata x from sys.all_objects
)
select Y
from cte
	outer apply dbo.udf_GetLocalizedTextI(x, 'eng') y;
30 окт 13, 17:19    [15054538]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить парсинг xml  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
alexeyvg
Переделайте в инлайн-функцию
Тут люди хотят вообще нечего не переделывать, а всунуть в скалярку гипер-двигатель.
30 окт 13, 17:52    [15054809]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить парсинг xml  [new]
cavalero
Member

Откуда: Прага
Сообщений: 247
Mnior
alexeyvg
Переделайте в инлайн-функцию
Тут люди хотят вообще нечего не переделывать, а всунуть в скалярку гипер-двигатель.


Понимаете, я не могу в данный момент уделить данной проблеме времени достаточно для ее правильного технического решения.

Временное решение, которое предложил Jaffar, является удовлетворительным в данной ситуации и у меня есть возможность отложить решение этого вопроса до более подходящего момента.
30 окт 13, 18:02    [15054864]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить парсинг xml  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31962
Mnior
alexeyvg
Переделайте в инлайн-функцию
Тут люди хотят вообще нечего не переделывать, а всунуть в скалярку гипер-двигатель.
Ну это было бы идеально.

Но нереально, у скалярной функции медленный вызов, поэтому даже если уменьшить время выполнения парса XML до нуля, это будет незаметно.

А вариант с инлайн-функцией хорош тем, что сохраняется структурирование кода, сохраняется собственно функция, но можно критичные запросы быстро, но постепенно переделывать.

То есть постепенно в критичных местах заменять:
select ..., dbo.udf_GetLocalizedText(...), ...

на
select ..., (select Y from dbo.udf_GetLocalizedTextI(...)), ...
30 окт 13, 18:25    [15055006]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить парсинг xml  [new]
cavalero
Member

Откуда: Прага
Сообщений: 247
alexeyvg
Mnior
пропущено...
Тут люди хотят вообще нечего не переделывать, а всунуть в скалярку гипер-двигатель.
Ну это было бы идеально.

Но нереально, у скалярной функции медленный вызов, поэтому даже если уменьшить время выполнения парса XML до нуля, это будет незаметно.

А вариант с инлайн-функцией хорош тем, что сохраняется структурирование кода, сохраняется собственно функция, но можно критичные запросы быстро, но постепенно переделывать.

То есть постепенно в критичных местах заменять:
select ..., dbo.udf_GetLocalizedText(...), ...

на
select ..., (select Y from dbo.udf_GetLocalizedTextI(...)), ...


На тестовой таблице в 1501 записей udf_GetLocalizedText (scalar-valued):

(1501 row(s) affected)

 SQL Server Execution Times:
   CPU time = 1373 ms,  elapsed time = 1405 ms.



udf_GetLocalizedTextI (table-valued) :

(1501 row(s) affected)

 SQL Server Execution Times:
   CPU time = 1607 ms,  elapsed time = 1615 ms.


Скалярная со стринговыми операцияи выигрывает у табличной с xml операциями.
30 окт 13, 19:14    [15055197]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить парсинг xml  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31962
cavalero
Скалярная со стринговыми операцияи выигрывает у табличной с xml операциями.
Странно, ещё раз померял, у меня на домашнем компе на 2000 строках с скалярной выполняется 250 мс, с табличной 3 мс

Вы, может быть, включаете пересылку данных на клиента, по сети для широких строк это может быть немало.
Я для замеров чисто серверных расходов делаю MAX от полученного.
Если без MAX, то получается 100 и 300 соответственно.
30 окт 13, 20:06    [15055374]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить парсинг xml  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31962
cavalero
Скалярная со стринговыми операцияи выигрывает у табличной с xml операциями.
Да, ну и можно сделать табличную с стринговыми операциями :-)
30 окт 13, 20:07    [15055378]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить парсинг xml  [new]
Jaffar
Member

Откуда:
Сообщений: 633
== >
автор
А вариант с инлайн-функцией хорош тем, что сохраняется структурирование кода, сохраняется собственно функция, но можно критичные запросы быстро, но постепенно переделывать.


--- инлайновую тоже можно наверное как-то так
create function if_1(@XML xml, @locate varchar(5))
returns table
as
return ( 
select case when t1.x1 > 0 and t2.x2 > t1.x1 then substring(@xml, t1.x1+21, t2.x2 - t1.x1 - 21) else '[N/A in '''+@locale+''']' end TXT
from (select charindex('<locale name="'+@locate+'">', @xml, 1) x1 ) t0
cross apply(select case when t0.x1 > 0 then t0.x1 else charindex('<locale name="en-US">', @xml, 1) end x1) t1
cross apply(select case when t1.x1 > 0 then charindex('</locale>', @xml, @x1+21) else 0 end x2) t2 /**/ )
go
здесь вместо IF - добавляем cross apply(select case when ) ...



Я конечно могу ошибаться - но при работе с XML как с XML а не как со строкой - происходит наверное сначала полный парсинг в какую-то структуру типа таблички(где-то в недрах), а потом уже быстрый и удобный выбор типа @XML.value(...).
А работа со строками - это чисто работа со строками. Поэтому если без XML. - то быстрее.

По поводу замера времени -можно так:
declare @TT datetime
set @TT = getdate()
----------------------
--- ...что-то тестим
----------------------    
select getdate() - @TT
31 окт 13, 09:07    [15056603]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить парсинг xml  [new]
cavalero
Member

Откуда: Прага
Сообщений: 247
День добрый!
Чтобы добить тему сделал следующий тест:

declare @TT datetime
set @TT = getdate()

declare
  @xdata xml;
select @xdata=v.x from (
  select * from (
  select
    1 tag, null parent, null [ml!1!],
    null [locale!2!name],
    null [locale!2!!ELEMENT]
  union all
  select
    2 tag, 1 parent, null,
    case number when 1 then 'en-US' else 'ru-RU' end,
    case number when 1 then 'eng' else N'рус' end
  from master..spt_values where type='P' and number between 1 and 2
  )v1
  for xml explicit, type
) v(x);
;with cte as (
  select @xdata x from sys.all_objects
)
select top 5000 
--dbo.udf_GetLocalizedText(x, 'ru-RU') ,
--dbo.udf_GetLocalizedText(x, 'ru-RU') ,
--dbo.udf_GetLocalizedText(x, 'ru-RU') ,
--dbo.udf_GetLocalizedText(x, 'ru-RU') ,
--dbo.udf_GetLocalizedText(x, 'ru-RU') ,
--dbo.udf_GetLocalizedText(x, 'ru-RU') ,
--dbo.udf_GetLocalizedText(x, 'ru-RU'), 
--dbo.udf_GetLocalizedText(x, 'ru-RU'), 
--dbo.udf_GetLocalizedText(x, 'ru-RU'), 
--dbo.udf_GetLocalizedText(x, 'ru-RU')

Y.txt,
Y1.txt,
Y2.txt,
Y3.txt,
Y4.txt,
Y5.txt,
Y6.txt,
Y7.txt,
Y8.txt,
Y9.txt



from cte
outer apply [dbo].udf_GetLocalizedTextI(x,'ru-RU') Y
outer apply [dbo].udf_GetLocalizedTextI(x,'ru-RU') Y1
outer apply [dbo].udf_GetLocalizedTextI(x,'ru-RU') Y2
outer apply [dbo].udf_GetLocalizedTextI(x,'ru-RU') Y3
outer apply [dbo].udf_GetLocalizedTextI(x,'ru-RU') Y4
outer apply [dbo].udf_GetLocalizedTextI(x,'ru-RU') Y5
outer apply [dbo].udf_GetLocalizedTextI(x,'ru-RU') Y6
outer apply [dbo].udf_GetLocalizedTextI(x,'ru-RU') Y7
outer apply [dbo].udf_GetLocalizedTextI(x,'ru-RU') Y8
outer apply [dbo].udf_GetLocalizedTextI(x,'ru-RU') Y9
;

select getdate() - @TT


Где udf_GetLocalizedText - скаляр, udf_GetLocalizedTextI - табличная функция.

Получаются следующие результаты:

Scalar (string operations) - 160 ms, Table (xml query) - 140-190ms, Table (string operations, код Jaffar'a из последнего поста) - 13 sec.
31 окт 13, 13:51    [15058495]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить парсинг xml  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Jaffar
при работе с XML как с XML а не как со строкой - происходит наверное сначала полный парсинг в какую-то структуру типа таблички(где-то в недрах), а потом уже быстрый и удобный выбор типа @XML.value(...).
Вот не надо фантазировать. Ладно?!

Вы про SAX парсинг слышали?

PS: Тоже протестил - аналогично, работа со строками не даёт заметного выигрыша.
1 ноя 13, 12:09    [15063677]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить