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

Откуда:
Сообщений: 69
скорость выполнения процедуры при использовании курсора в несколько десятков раз дольше чем без курсора, что можно сделать с этим?
у меня в процедуре формируется отчет в виде html, соответственно формирую в таблицу (declare @s table) результат и потом запускаю курсор (DECLARE cur CURSOR LOCAL FORWARD_ONLY STATIC FOR) после чего заполняю в переменную html по каждой строке

что можно сделать для увеличения скорость или может как то по другому можно формировать?
29 ноя 15, 20:39    [18488753]     Ответить | Цитировать Сообщить модератору
 Re: Тормоза при использовании курсора  [new]
Glory
Member

Откуда:
Сообщений: 104751
dim---76
скорость выполнения процедуры при использовании курсора в несколько десятков раз дольше чем без курсора, что можно сделать с этим?

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

Сообщение было отредактировано: 29 ноя 15, 20:48
29 ноя 15, 20:44    [18488766]     Ответить | Цитировать Сообщить модератору
 Re: Тормоза при использовании курсора  [new]
dim---76
Member

Откуда:
Сообщений: 69
так искал где тормоза
а убрать их ни как, так как в курсоре формирую отчет
SET @resHTML='<h2>Аналитический отчет<br>'
SET @resHTML=@resHTML+'За период с '+rtrim(convert(nvarchar(50),@DN, 104))+' '+rtrim(convert(nvarchar(50),@DN, 14))+' по '+rtrim(convert(nvarchar(50),@DK, 104))+' '+rtrim(convert(nvarchar(50),@DK, 14))+'<br></h2>'
SET @resHTML=@resHTML+'<table cellspacing="0" cellpadding="0" border="0">'
SET @resHTML=@resHTML+'<TR>'
SET @resHTML=@resHTML+'<td width="50px" bgcolor="#FFC000" style="border:1px solid black;text-align:center;">Поз</td>'
SET @resHTML=@resHTML+'<td width="50px" bgcolor="#FFC000" style="border:1px solid black;text-align:center;">Номер</td>'
SET @resHTML=@resHTML+'<td width="50px" bgcolor="#FFC000" style="border:1px solid black;text-align:center;">Всего</td> '
SET @resHTML=@resHTML+'<td width="70px" bgcolor="#FFC000" style="border:1px solid black;text-align:center;">Сумма</td> '
SET @resHTML=@resHTML+'<td width="70px" bgcolor="#FFC000" style="border:1px solid black;text-align:center;">Вып</td> '
SET @resHTML=@resHTML+'<td width="70px" bgcolor="#FFC000" style="border:1px solid black;text-align:center;">Процент</td> '
SET @resHTML=@resHTML+'<td width="70px" bgcolor="#FFC000" style="border:1px solid black;text-align:center;">Беспл.</td> '
SET @resHTML=@resHTML+'<td width="70px" bgcolor="#FFC000" style="border:1px solid black;text-align:center;">Процент</td>
SET @resHTML=@resHTML+'<td width="70px" bgcolor="#FFC000" style="border:1px solid black;text-align:center;">Сумма</td> '
SET @resHTML=@resHTML+'<td width="70px" bgcolor="#FFC000" style="border:1px solid black;text-align:center;">Общая сумма</td> '
SET @resHTML=@resHTML+'<td width="70px" bgcolor="#FFC000" style="border:1px solid black;text-align:center;">Итог</td> '
SET @resHTML=@resHTML+'</TR>'
........
29 ноя 15, 20:48    [18488782]     Ответить | Цитировать Сообщить модератору
 Re: Тормоза при использовании курсора  [new]
Glory
Member

Откуда:
Сообщений: 104751
dim---76
а убрать их ни как, так как в курсоре формирую отчет

Тогда в чем смысл пассажа "скорость выполнения процедуры при использовании курсора в несколько десятков раз дольше чем без курсора" ?
29 ноя 15, 20:50    [18488794]     Ответить | Цитировать Сообщить модератору
 Re: Тормоза при использовании курсора  [new]
dim---76
Member

Откуда:
Сообщений: 69
вопрос в том как можно уменьшить время выполнения процедуры
ошибся в вопросе не скорость выполнения процедуры, а время выполнения процедуры
29 ноя 15, 21:06    [18488847]     Ответить | Цитировать Сообщить модератору
 Re: Тормоза при использовании курсора  [new]
Glory
Member

Откуда:
Сообщений: 104751
dim---76
вопрос в том как можно уменьшить время выполнения процедуры

Найти узкое место и _переписать_ его
29 ноя 15, 21:09    [18488858]     Ответить | Цитировать Сообщить модератору
 Re: Тормоза при использовании курсора  [new]
dim---76
Member

Откуда:
Сообщений: 69
узкое место это курсор, и как обойтись без него в моей задаче?
29 ноя 15, 21:13    [18488873]     Ответить | Цитировать Сообщить модератору
 Re: Тормоза при использовании курсора  [new]
Glory
Member

Откуда:
Сообщений: 104751
dim---76
и как обойтись без него в моей задаче?

Для этого нужно для начала опубликовать эту задачу
29 ноя 15, 21:14    [18488877]     Ответить | Цитировать Сообщить модератору
 Re: Тормоза при использовании курсора  [new]
dim---76
Member

Откуда:
Сообщений: 69
задача опубликована, а приводить код смысла нет так как в вопросе все указанно
но специально для Вас могу
declare @resHTML as nvarchar(max)

DECLARE cur CURSOR FOR
		Select driver_sig,kol_zak,sum_sdan from @s2 order by CONVERT(int, driver_sig)
	OPEN cur
	FETCH NEXT FROM cur INTO @driver_sig,@kol_zak,@sum_sdan
	WHILE @@FETCH_STATUS = 0
	BEGIN
		SET @resHTML=@resHTML+'<TR>'
		SET @resHTML=@resHTML+'<td style="border:1px solid black;text-align:center;"> '+isnull(@driver_sig,'')+'</td>'
		SET @resHTML=@resHTML+'<td style="border:1px solid black;text-align:center;"> </td>'
		SET @resHTML=@resHTML+'<td style="border:1px solid black;text-align:center;"> </td>'
		SET @resHTML=@resHTML+'<td style="border:1px solid black;text-align:center;"> </td>'
		SET @resHTML=@resHTML+'<td style="border:1px solid black;text-align:center;"> </td>'
		SET @resHTML=@resHTML+'<td style="border:1px solid black;text-align:center;"> </td>'
		SET @resHTML=@resHTML+'<td style="border:1px solid black;text-align:center;"> </td>'
		SET @resHTML=@resHTML+'<td style="border:1px solid black;text-align:center;"> </td>'
		SET @resHTML=@resHTML+'<td style="border:1px solid black;text-align:center;"> </td>'
		SET @resHTML=@resHTML+'</TR>'
		FETCH NEXT FROM cur INTO @driver_sig,@kol_zak,@sum_sdan
	END
	CLOSE cur
	DEALLOCATE cur


причем чем больше строк SET @resHTML=@resHTML+'<td style="border:1px solid black;text-align:center;"> </td>'
тем дольше делается (с одной моментально, а больше 3 уже тормоза)
29 ноя 15, 22:30    [18489123]     Ответить | Цитировать Сообщить модератору
 Re: Тормоза при использовании курсора  [new]
leov
Member

Откуда: С-Петербург
Сообщений: 616
dim---76,

поищите тут где-то было про склейку больших строк через FOR XML
сам в этом к сожалению слабо разбираюсь
я склеивал на клиенте
29 ноя 15, 22:49    [18489186]     Ответить | Цитировать Сообщить модератору
 Re: Тормоза при использовании курсора  [new]
leov
Member

Откуда: С-Петербург
Сообщений: 616
leov
dim---76,

поищите тут где-то было про склейку больших строк через FOR XML
сам в этом к сожалению слабо разбираюсь
я склеивал на клиенте

вот тут вроде в своем избранном нашел
29 ноя 15, 22:51    [18489196]     Ответить | Цитировать Сообщить модератору
 Re: Тормоза при использовании курсора  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31983
leov
leov
dim---76,

поищите тут где-то было про склейку больших строк через FOR XML
сам в этом к сожалению слабо разбираюсь
я склеивал на клиенте

вот тут вроде в своем избранном нашел
В принципе метод хороший, но первым делом нужно понять, а нужна ли переменная, и не лучше ли вывести просто рекордсет. Клиент соберёт его в поток вывода как минимум не хуже, чем сиквел.
30 ноя 15, 01:46    [18489639]     Ответить | Цитировать Сообщить модератору
 Re: Тормоза при использовании курсора  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6202
Курсор здесь вообще не нужен. Обычный select for xml, и XSLT на клиенте - и всё. Как-то вот так: 15988736.
30 ноя 15, 03:08    [18489669]     Ответить | Цитировать Сообщить модератору
 Re: Тормоза при использовании курсора  [new]
dim---76
Member

Откуда:
Сообщений: 69
alexeyvg
leov
пропущено...

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


понятно, что клиент сделал бы лучше, но требование заказчика такое что бы менять отчет не меняя программы, да и отчет используется разными клиентами, так что проще сиквел
30 ноя 15, 04:26    [18489683]     Ответить | Цитировать Сообщить модератору
 Re: Тормоза при использовании курсора  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 28355
dim---76
alexeyvg
пропущено...
В принципе метод хороший, но первым делом нужно понять, а нужна ли переменная, и не лучше ли вывести просто рекордсет. Клиент соберёт его в поток вывода как минимум не хуже, чем сиквел.


понятно, что клиент сделал бы лучше, но требование заказчика такое что бы менять отчет не меняя программы, да и отчет используется разными клиентами, так что проще сиквел
дак может он хочет шаблон отчета менять, Вы уточнили бы

А то захочет клиент шрифт в заголовке изменить, а оказывается надо в SQL лезть :)
30 ноя 15, 08:29    [18489901]     Ответить | Цитировать Сообщить модератору
 Re: Тормоза при использовании курсора  [new]
Serg_77m
Member

Откуда: Донецк
Сообщений: 237
dim---76
так искал где тормоза
а убрать их ни как, так как в курсоре формирую отчет

Можно без курсора.
declare @s2 table (driver_sig nvarchar(50),kol_zak int,sum_sdan numeric(13,2))
insert into @s2 values ('1',5,12000.00)
insert into @s2 values ('2',8,41000.00)
insert into @s2 values ('3',3,26000.00)

declare @resHTML as nvarchar(max)
SET @resHTML='<h2>Аналитический отчет<br>'
/* ... */
set @resHTML=@resHTML+(
Select
  'border:1px solid black;text-align:center;' as [TD/@style],
  driver_sig as [TD],
  '',
  'border:1px solid black;text-align:center;' as [TD/@style],
  kol_zak as [TD],
  '',
  'border:1px solid black;text-align:center;' as [TD/@style],
  sum_sdan as [TD]
from @s2 
order by CONVERT(int, driver_sig)
for xml path('TR')
)

select @resHTML

А в принципе, можно весь HTML (вернее, XHTML) сформировать одним SQL-оператором.
30 ноя 15, 09:13    [18490015]     Ответить | Цитировать Сообщить модератору
 Re: Тормоза при использовании курсора  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31983
dim---76
понятно, что клиент сделал бы лучше, но требование заказчика такое что бы менять отчет не меняя программы, да и отчет используется разными клиентами, так что проще сиквел
Ну, тогда используйте вариант с XML по ссылке, или из примера Serg_77m
30 ноя 15, 10:55    [18490574]     Ответить | Цитировать Сообщить модератору
 Re: Тормоза при использовании курсора  [new]
dim---76
Member

Откуда:
Сообщений: 69
спасибо, сделал как Serg_77m, тормозов нет
30 ноя 15, 17:02    [18493397]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить