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

Откуда: Київ
Сообщений: 10428
Есть T-SQL процедура, у нее параметр идентификатор записи в мастер таблице.
Она делает выборку и заполняет временную таблицу-переменную идентификаторами записей и строками из детайл таблицы.

Затем в цикле на каждой записи вызвается SQLCLR процедура, которая с базой не работает, а только
преобразует строку и на выходе возвращает строку.

Из этих строк формируется одна сборная строка и после цикла делается апдейт мастер таблицы
этой сформированной строкой.

Медленно обрабатываются записи.

Есть ли смысл с точки зрения производительности зарыть это всё в SQCLR процедуру, передавать ей ид записи в мастер таблице и пусть она делает выборки, обработку и апдейт?
27 окт 13, 12:54    [15037469]     Ответить | Цитировать Сообщить модератору
 Re: SQLCLRL: как сделать лучше?  [new]
Алексей Куренков
Member [заблокирован]

Откуда: Москва
Сообщений: 567
Winnipuh,

Насколько я понял, у Вас курсор в котором идет вызов CLR процедуры?

Если сможете переделать на скалярную или табличную CLR функцию, то можно будет апдейт сделать одной командой, или же если эта команда не быстрая и вызывает много блокировок, то разбить апдейт на пакеты...

на тему: зарыть это всё в SQCLR процедуру
А можете пояснить что делает эта SQCLR?

Было бы проще оценить "тормоза" увидев T-SQL код который медленный.
27 окт 13, 14:10    [15037548]     Ответить | Цитировать Сообщить модератору
 Re: SQLCLRL: как сделать лучше?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Алексей Куренков
Winnipuh,

Насколько я понял, у Вас курсор в котором идет вызов CLR процедуры?

Если сможете переделать на скалярную или табличную CLR функцию, то можно будет апдейт сделать одной командой, или же если эта команда не быстрая и вызывает много блокировок, то разбить апдейт на пакеты...

на тему: зарыть это всё в SQCLR процедуру
А можете пояснить что делает эта SQCLR?

Было бы проще оценить "тормоза" увидев T-SQL код который медленный.


я попробую по памяти приблизительно изобразить

ALTER PROCEDURE [dbo].[usp_process]
(
	@master_id	uniqueidentifier
)
AS
BEGIN
declare @t(int_id int identity, id uniqueidentifier, t_text nvarchar(4000))
declare @int_id int, @id uniqueidentifier, 
            @t_text nvarchar(4000), 
            @summary_text nvarchar(MAX)

insert into @t(id, t_text)
select id, t_text from t_detail where id=@master_id

set @int_id=0
set @summary_text nvarchar= N''

while(1=1)
begin

        select @t_text=dbo.fn_Preprocess(t_text) where int_id>@int_id order by int_id
        set @summary_text = @summary_text+N' '+@t_text;
end

update t_master set summary_text=@summary_text where id=@master_id;
END



Писал руками, не проверял, но приблизительно так.
Сейчас эта SQLCLR функция не коннектиться к базе, только берет входящий текст, обрабатывает его и возвращает текст.

Что имеется в виду под медленно:
эта процедура обрабатывает брокерскую очередь, куда поступают идентификаторы мастер таблицы, и когда в очередь вкидывается 20-30 записей я делаю запросы к очереди и вижу как записи по одной уходят оттуда.

Функция сама тоже не подарок, она на входе получает rtf, а на выходе выдает чистый текст из этого rtf.
Но тексты не большие, 2-3 кб.
27 окт 13, 14:37    [15037579]     Ответить | Цитировать Сообщить модератору
 Re: SQLCLRL: как сделать лучше?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31960
Winnipuh
Есть T-SQL процедура, у нее параметр идентификатор записи в мастер таблице.
Она делает выборку и заполняет временную таблицу-переменную идентификаторами записей и строками из детайл таблицы.

Затем в цикле на каждой записи вызвается SQLCLR процедура, которая с базой не работает, а только
преобразует строку и на выходе возвращает строку.

Из этих строк формируется одна сборная строка и после цикла делается апдейт мастер таблицы
этой сформированной строкой.

Медленно обрабатываются записи.

Есть ли смысл с точки зрения производительности зарыть это всё в SQCLR процедуру, передавать ей ид записи в мастер таблице и пусть она делает выборки, обработку и апдейт?
Есть смысл переделать SQLCLR процедуру на агрегатную SQLCLR функцию, ИМХО будет быстрее.

Но лучше не по памяти тут писать, а точнее.
И желательно получить какую то информацию по времени, на что оно тратится. На вызовы SQLCLR, на конкатенацию, на цикл и т.п.?
27 окт 13, 21:50    [15038624]     Ответить | Цитировать Сообщить модератору
 Re: SQLCLRL: как сделать лучше?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
кстати, про агрегатную функцию это мысль.
27 окт 13, 22:00    [15038666]     Ответить | Цитировать Сообщить модератору
 Re: SQLCLRL: как сделать лучше?  [new]
invm
Member

Откуда: Москва
Сообщений: 9833
Winnipuh
кстати, про агрегатную функцию это мысль.
Все рано это будет CLR-функция. А вызов CLR - дорогое удовольствие. К тому же, если нужна конкатенация в определенном порядке, с агрегатной функцией этого не сделать.
27 окт 13, 22:19    [15038729]     Ответить | Цитировать Сообщить модератору
 Re: SQLCLRL: как сделать лучше?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
invm
Winnipuh
кстати, про агрегатную функцию это мысль.
Все рано это будет CLR-функция. А вызов CLR - дорогое удовольствие. К тому же, если нужна конкатенация в определенном порядке, с агрегатной функцией этого не сделать.


да, порядок вообще-то важен.
А что - ордер бай никак не вкрутить?
27 окт 13, 22:21    [15038734]     Ответить | Цитировать Сообщить модератору
 Re: SQLCLRL: как сделать лучше?  [new]
invm
Member

Откуда: Москва
Сообщений: 9833
Winnipuh
ордер бай никак не вкрутить?
Куда?
27 окт 13, 23:01    [15038811]     Ответить | Цитировать Сообщить модератору
 Re: SQLCLRL: как сделать лучше?  [new]
Roul_Duke
Member

Откуда: Киев
Сообщений: 89
Winnipuh,
Скажите SQLCLR это обяз?? может стандартными средствами выйдет? какие преобразования происходят??
28 окт 13, 00:09    [15039011]     Ответить | Цитировать Сообщить модератору
 Re: SQLCLRL: как сделать лучше?  [new]
Алексей Куренков
Member [заблокирован]

Откуда: Москва
Сообщений: 567
Winnipuh
while(1=1)
begin

        select @t_text=dbo.fn_Preprocess(t_text) where int_id>@int_id order by int_id
        set @summary_text = @summary_text+N' '+@t_text;
end



Абсолютно не понятна логика цикла...
1. где выход из бесконечного цикла?
2. select t_text where int_id > @int_id - откуда t_text, int_id? может from забыли?

И далее... я так понимаю CLR это - dbo.fn_Process?

Если так не могли бы сделать замеры по времени с вызовом этой функцией и без вызова? типа:
1. select @t_text=dbo.fn_Preprocess(t_text) ...
2. select @t_text=t_text ...

Большая разница во времени? Может деградация производительности не из за функции?
28 окт 13, 08:46    [15039463]     Ответить | Цитировать Сообщить модератору
 Re: SQLCLRL: как сделать лучше?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31960
invm
Winnipuh
кстати, про агрегатную функцию это мысль.
Все рано это будет CLR-функция. А вызов CLR - дорогое удовольствие.
По моему, для агрегатов как раз нормально, не сравнить с вызовами скалярной функции из T-SQL
28 окт 13, 09:13    [15039551]     Ответить | Цитировать Сообщить модератору
 Re: SQLCLRL: как сделать лучше?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Алексей Куренков
Winnipuh
while(1=1)
begin

        select @t_text=dbo.fn_Preprocess(t_text) where int_id>@int_id order by int_id
        set @summary_text = @summary_text+N' '+@t_text;
end



Абсолютно не понятна логика цикла...
1. где выход из бесконечного цикла?
2. select t_text where int_id > @int_id - откуда t_text, int_id? может from забыли?

И далее... я так понимаю CLR это - dbo.fn_Process?

Если так не могли бы сделать замеры по времени с вызовом этой функцией и без вызова? типа:
1. select @t_text=dbo.fn_Preprocess(t_text) ...
2. select @t_text=t_text ...

Большая разница во времени? Может деградация производительности не из за функции?


это "псевдокод" , есть там выход...все работает, но "не быстро".
28 окт 13, 10:46    [15039883]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить