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

Откуда: Київ
Сообщений: 10428
Клиентское приложение вызывает процедуру, 2-3 раза она выполняется за приемлемое время, затем время увеличивается практически на порядок.
В процедуре есть запрос типа

IF  EXISTS(SELECT 1 
			FROM dbo.get_children(@guid) ch
			INNER JOIN dbo.nodes3 n
			ON n.[id] = ch.node_id AND n.deleted =0
			WHERE (dbo.get_permission_value(ch.node_id) & 2 = 0)
...


В профайлере именно этот вызов показывает время сначала n sec, затем n*10 sec
В частности dbo.get_children показывает Estimated rows=1, Actual rows=16000

Процедуру можно сделать with recompile. Что сделать с функцией кроме того, что убрать и развернуть код в процедуре?
15 апр 15, 14:21    [17518561]     Ответить | Цитировать Сообщить модератору
 Re: Увеличение времени выполнения процедуры  [new]
iap
Member

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

get_children - табличная inline-функция с рекурсивным CTE внутри?
15 апр 15, 14:29    [17518608]     Ответить | Цитировать Сообщить модератору
 Re: Увеличение времени выполнения процедуры  [new]
Winnipuh
Member [заблокирован]

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

get_children - табличная inline-функция с рекурсивным CTE внутри?


табличная, но не рекурсивным, а с циклом типа такого:

ALTER  FUNCTION [dbo].[get_children]
	(@node_id uniqueidentifier)
RETURNS @out table
	 (
	node_id	uniqueidentifier,
	parent_id	uniqueidentifier,
	 [level]	int not null default 0
	)
AS  
BEGIN 
declare @rows	int

insert into @out(node_id,parent_id)
select [id], parent_id from dbo.nodes where parent_id=@node_id
set @rows=@@ROWCOUNT
while(@rows>0)
begin
	update @out set [level]=[level]+1
	insert into @out(node_id,parent_id)
	select [id], parent_id from dbo.nodes
	where parent_id in (select node_id from @out where [level]=1)
	set @rows=@@ROWCOUNT; if(@rows=0) break;
end
RETURN
END
15 апр 15, 14:35    [17518653]     Ответить | Цитировать Сообщить модератору
 Re: Увеличение времени выполнения процедуры  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Winnipuh
В профайлере именно этот вызов показывает время сначала n sec, затем n*10 sec


для одного и того же значения входного параметра? и на одних и тех же данных?
15 апр 15, 14:38    [17518675]     Ответить | Цитировать Сообщить модератору
 Re: Увеличение времени выполнения процедуры  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Хоть бы индекс что ли по node_id был...
15 апр 15, 14:39    [17518681]     Ответить | Цитировать Сообщить модератору
 Re: Увеличение времени выполнения процедуры  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Crimean
Winnipuh
В профайлере именно этот вызов показывает время сначала n sec, затем n*10 sec


для одного и того же значения входного параметра? и на одних и тех же данных?


параметр - это грубо говоря гуид корня поддерева.

Вызовы гуид1, гуид2, ..., гуид1,.... - для второго гуид1 проваливается и дальше для любых уже таким остается, потом может прочухаться
15 апр 15, 14:41    [17518692]     Ответить | Цитировать Сообщить модератору
 Re: Увеличение времени выполнения процедуры  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
iap
Хоть бы индекс что ли по node_id был...


есть
15 апр 15, 14:41    [17518697]     Ответить | Цитировать Сообщить модератору
 Re: Увеличение времени выполнения процедуры  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Мне что-то думамется, что табличные функции скорее зло, чем не зло.
15 апр 15, 14:42    [17518707]     Ответить | Цитировать Сообщить модератору
 Re: Увеличение времени выполнения процедуры  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Winnipuh
iap
Хоть бы индекс что ли по node_id был...


есть
Я имел в виду индекс у функции. Есть? Из текста не следует, однако.
15 апр 15, 14:42    [17518714]     Ответить | Цитировать Сообщить модератору
 Re: Увеличение времени выполнения процедуры  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
iap
Winnipuh
пропущено...


есть
Я имел в виду индекс у функции. Есть? Из текста не следует, однако.


а, нету
15 апр 15, 14:43    [17518717]     Ответить | Цитировать Сообщить модератору
 Re: Увеличение времени выполнения процедуры  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Winnipuh
Мне что-то думамется, что табличные функции скорее зло, чем не зло.
Инлайновые ничего так, вообще-то.
У мультистэйтментовых индекс бывает, что помогает.
15 апр 15, 14:44    [17518722]     Ответить | Цитировать Сообщить модератору
 Re: Увеличение времени выполнения процедуры  [new]
Crimean
Member

Откуда:
Сообщений: 13148
ну так данные в nodes могут же меняться
15 апр 15, 14:45    [17518734]     Ответить | Цитировать Сообщить модератору
 Re: Увеличение времени выполнения процедуры  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Crimean
ну так данные в nodes могут же меняться


да, скажем, между вызовами с тем же параметром данные в таблице могут изменяться
15 апр 15, 14:49    [17518761]     Ответить | Цитировать Сообщить модератору
 Re: Увеличение времени выполнения процедуры  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Crimean
ну так данные в nodes могут же меняться
Имел в виду что-то такое:
RETURNS @out table
	 (
	node_id	uniqueidentifier unique,
	parent_id	uniqueidentifier,
	 [level]	int not null default 0
	)
Не факт, что поможет, но снаружи-то по этому полю JOIN...
15 апр 15, 14:49    [17518765]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить