Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 XML parcing with Table Value Function  [new]
NIIIK
Member

Откуда: Россия, Ростовская область, г. Таганрог
Сообщений: 1295
Всем доброго времени суток!

Среди входных параметров процедуры есть XML (список идентификаторов для фильтрации)

Если я делаю табличную функцию, которая принимает на вход этот ХМЛ и возвращает таблицу, сразу её inner join-ю, то работает долго (особенно при первом запуске).
Если я создаю табличную переменнную и сохраняю туда результат, то работает быстро (значительно быстрее).

Когда я смотрю на планы вполнения, то планвыполнения запроса "одним запросом" очень очень похож на суммарный план выполнения двух запросов.

1) почему это происходит?
2) как этого избежать и правильно делать?
3) можно ли такое пофиксить во всех местах (процедурах, запросах) без переписывания кода

Пример плана выполнения прикрепил скрином.

К сообщению приложен файл. Размер - 106Kb
8 окт 12, 14:07    [13284442]     Ответить | Цитировать Сообщить модератору
 Re: XML parcing with Table Value Function  [new]
step_ks
Member

Откуда:
Сообщений: 936
Функция инлайновая? Если с табличной переменной лучше, то можно попробовать сделать неинлайновую. Хотя, как и многие, считаю это неправильным, но в качестве быстрого решения, когда надо спрятать кусок плана от оптимизатора, может сгодиться.
8 окт 12, 15:01    [13284949]     Ответить | Цитировать Сообщить модератору
 Re: XML parcing with Table Value Function  [new]
step_ks
Member

Откуда:
Сообщений: 936
если там не тыщи миллионов записей, конечно.
8 окт 12, 15:01    [13284954]     Ответить | Цитировать Сообщить модератору
 Re: XML parcing with Table Value Function  [new]
NIIIK
Member

Откуда: Россия, Ростовская область, г. Таганрог
Сообщений: 1295
идею затычки понял, спасибо!

Хотя надеялся что инлайновая "круче" :)
8 окт 12, 15:11    [13285048]     Ответить | Цитировать Сообщить модератору
 Re: XML parcing with Table Value Function  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Правильно, для нас всех, было с вашей стороны на основе вашего запроса подобрать минимальный пример, который ведёт так себя не адекватно. И зарегать бажок.
Вот пример похожего поведения.
Если и так дальше будет +2 для таких багов, они их никогда не пофиксят.
Активнее.
8 окт 12, 15:22    [13285141]     Ответить | Цитировать Сообщить модератору
 Re: XML parcing with Table Value Function  [new]
NIIIK
Member

Откуда: Россия, Ростовская область, г. Таганрог
Сообщений: 1295
Mnior,

отписался, плюсанул.
8 окт 12, 15:49    [13285401]     Ответить | Цитировать Сообщить модератору
 Re: XML parcing with Table Value Function  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
NIIIK, А у вас таже проблема?
За + спасибо.
8 окт 12, 16:43    [13285861]     Ответить | Цитировать Сообщить модератору
 Re: XML parcing with Table Value Function  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
А, это ваш коммент. Ok
8 окт 12, 16:45    [13285881]     Ответить | Цитировать Сообщить модератору
 Re: XML parcing with Table Value Function  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Mnior
NIIIK, А у вас таже проблема?
NIIIK
set @sql = replace(@sql, '%XML_EMPLOYEE_FILTER%',
    case
     when @xmlEmployee is not null
     then 'inner
             join dbo.fnXmlGetPrimaryKey(@xmlEmployee) xml_emp
             on xml_emp.pk = emp.pk'
     else ''
    end);
А вы текст dbo.fnXmlGetPrimaryKey можете привести? Точнее как вы именно передаёте XML и выдираете .node()
Проблема вроде не в том что делается парсинг из VarChar(max), а в том что делается LOOP не по таблице, а по XML.node().
8 окт 12, 16:52    [13285918]     Ответить | Цитировать Сообщить модератору
 Re: XML parcing with Table Value Function  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
И зря вы упомянули динамику, это может сбить людей. Термозит же даже в статике, так? Поэтому эту ненужную подробность надо опускать.
8 окт 12, 16:54    [13285926]     Ответить | Цитировать Сообщить модератору
 Re: XML parcing with Table Value Function  [new]
NIIIK
Member

Откуда: Россия, Ростовская область, г. Таганрог
Сообщений: 1295
Mnior
И зря вы упомянули динамику, это может сбить людей. Термозит же даже в статике, так? Поэтому эту ненужную подробность надо опускать.

надеюсь их это не смутит.
Как я думаю, что любой запрос для SQL Server динамический. Просто иногда он сам себе клиент, который его запускает через sp_sqlexecute так же как если бы он был запущен из окошка SSMS

Текст функции банальный
/*
Author: Nikita Pochechuev
Approved:

Description:
Returns standard XML as table 

https://connect.microsoft.com/SQLServer/feedback/details/662843#details
https://www.sql.ru/forum/actualthread.aspx?tid=974711&pg=-1#


--Test Case

declare @xml xml = '<r><i>23B34F5E-B379-E111-B541-00155D894A57</i><i>40428FDD-B379-E111-B541-00155D894A57</i></r>';
select * 
  from [dbo].[fnXmlGetPrimaryKey](@xml) t
*/

ALTER function [dbo].[fnXmlGetPrimaryKey]
(
 @xml xml
)
/*
returns table
AS return

(
select distinct
		     t.c.value('.', 'uniqueidentifier') as pk
	 from @xml.nodes('/r/i') t(c)
)*/
returns @tRusult table (pk uniqueidentifier primary key)
begin

 insert
   into @tRusult
 select distinct
        t.c.value('.', 'uniqueidentifier') as pk
   from @xml.nodes('/r/i') t(c);

 return;

end;
8 окт 12, 17:00    [13285980]     Ответить | Цитировать Сообщить модератору
 Re: XML parcing with Table Value Function  [new]
NIIIK
Member

Откуда: Россия, Ростовская область, г. Таганрог
Сообщений: 1295
@tResult исправлено
8 окт 12, 17:01    [13285989]     Ответить | Цитировать Сообщить модератору
 Re: XML parcing with Table Value Function  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
NIIIK
 select distinct
Ну дык тут всё понятно.
Короче зря вы туда запостили.

Вам сюда нужно: Need hints for spooling behavior

PS: Запомните, если вы не разбираетесь, то не надо на connection посты клепать. Там для разрабов, а не для юзверей. Ok?
10 окт 12, 14:03    [13295892]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить