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

Откуда:
Сообщений: 11
Есть процедура по разборке тарного места

DECLARE @MyTableVar table (
id_tov nvarchar(70),
id_doc nvarchar(70),
kol_t money
);

DECLARE @MyS table (
auth_sekz char(2)
);

DELETE tarn_t
OUTPUT
DELETED.id_tov,
DELETED.id_doc,
DELETED.kol_t
INTO @MyTableVar
from tarn_t where
tarn_t.id = @tarn_id;

delete tarn_h OUTPUT DELETED.auth_sekz INTO @MyS from tarn_h where
tarn_h.id = @tarn_id;

update [1journal_t] set kolsklad = kolsklad - W.kol_t,statusdoc3=2,
namesotr=null, codesotr=null, idreason=null
from [1journal_t] t , @MyTableVar W
where t.idtovar = W.id_tov and t.iddoc1 = W.id_doc

в таблицах tarn_h и tarn_t есть индексы по id, в таблице journal_t по idtovar и iddoc1

разборка тарного происходит долго (зависит от количество строк конкретного @tarn_id), раньше было на порядок быстрей
возможно ли оптимизировать код, или хотя бы дать совет по оптимизации.

В sql не силен поэтому прошу помощи, сам думаю что медленно отрабатывает последний update со временной таблицей.

Microsoft SQL Server 2005 - 9.00.2047.00 (Intel X86) Apr 14 2006 01:12:25 Copyright (c) 1988-2005 Microsoft Corporation Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
10 июл 12, 08:03    [12842318]     Ответить | Цитировать Сообщить модератору
 Re: Помогите ускорить хранимую процедуру  [new]
VSVLAD
Member

Откуда: Краснодар
Сообщений: 1398
yhvvh,

Не сильный спец, но я бы попробал для теста заменить MyS, именно временной таблицей, а не переменная декларированная как таблица. Прирост скорости должен быть.
10 июл 12, 08:09    [12842323]     Ответить | Цитировать Сообщить модератору
 Re: Помогите ускорить хранимую процедуру  [new]
yhvvh
Member

Откуда:
Сообщений: 11
а как создать и использовать именно временную таблицу а не табличную переменную?
прочитал
https://www.sql.ru/forum/actualthread.aspx?tid=580525

и еще больше вопросов стало чем ответов.
10 июл 12, 08:27    [12842357]     Ответить | Цитировать Сообщить модератору
 Re: Помогите ускорить хранимую процедуру  [new]
yhvvh
Member

Откуда:
Сообщений: 11
речь идет о 10-100 строк, объемы не большие
10 июл 12, 08:38    [12842390]     Ответить | Цитировать Сообщить модератору
 Re: Помогите ускорить хранимую процедуру  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
yhvvh
DECLARE @MyTableVar TABLE (
	 id_tov	nvarchar(70)
	,id_doc	nvarchar(70)
	,kol_t	money
);
DECLARE @MyS TABLE (
	 auth_sekz char(2)
);

DELETE	T
OUTPUT	 DELETED.id_tov
	,DELETED.id_doc
	,DELETED.kol_t
INTO	@MyTableVar
FROM	dbo.tarn_t T
where	T.id = @tarn_id; -- Несколько строк

DELETE	H
OUTPUT	 DELETED.auth_sekz
INTO	@MyS
FROM	dbo.tarn_h H
WHERE	H.id = @tarn_id; -- Несколько строк

UPDATE	J
SET	 kolsklad	= kolsklad - W.kol_t
	,statusdoc	= 2
	,namesotr	= NULL
	,codesotr	= NULL
	,idreason	= NULL
FROM	     dbo.journal_t	J 
	JOIN @MyTableVar	W ON J.idtovar = W.id_tov
				 AND J.iddoc1  = W.id_doc

индексы:
- dbo.tarn_h (ID)
- dbo.tarn_t (ID)

- dbo.journal_t (idtovar, iddoc1) ?
или
- dbo.journal_t (idtovar)
dbo.journal_t (iddoc1)
?


разборка тарного происходит долго (зависит от количество строк конкретного @tarn_id), раньше было на порядок быстрей
возможно ли оптимизировать код, или хотя бы дать совет по оптимизации.
VSVLAD, прикольно вы троллите, т.к. @MyS вообще не причём.
10 июл 12, 08:42    [12842406]     Ответить | Цитировать Сообщить модератору
 Re: Помогите ускорить хранимую процедуру  [new]
yhvvh
Member

Откуда:
Сообщений: 11
- dbo.journal_t (idtovar)
dbo.journal_t (iddoc1)
10 июл 12, 09:29    [12842589]     Ответить | Цитировать Сообщить модератору
 Re: Помогите ускорить хранимую процедуру  [new]
yhvvh
Member

Откуда:
Сообщений: 11
не составной
10 июл 12, 09:32    [12842602]     Ответить | Цитировать Сообщить модератору
 Re: Помогите ускорить хранимую процедуру  [new]
yhvvh
Member

Откуда:
Сообщений: 11
спасибо
10 июл 12, 10:38    [12843020]     Ответить | Цитировать Сообщить модератору
 Re: Помогите ускорить хранимую процедуру  [new]
yhvvh
Member

Откуда:
Сообщений: 11
быстрей не стало :-(
10 июл 12, 15:32    [12845472]     Ответить | Цитировать Сообщить модератору
 Re: Помогите ускорить хранимую процедуру  [new]
user89
Member

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

индекс можно повесить и на табличную переменную

DECLARE @MyTableVar table (
id_tov nvarchar(70), 
id_doc nvarchar(70), 
kol_t money
, primary key(id_tov, id_doc)
);

А это
from [1journal_t] t , @MyTableVar W
where t.idtovar = W.id_tov and t.iddoc1 = W.id_doc
лучше заменить на inner join
from [1journal_t] t
inner join @MyTableVar W on (t.idtovar = W.id_tov) and (t.iddoc1 = W.id_doc)

+ По мотивам форума

-- В табличной переменной) сделать PRIMARY KEY на два поля
declare @t table(id1 int, id2 int, [name] varchar(25), primary key(id1, id2))
insert into @t
select 1, 2, 'i1' union all
select 1, 2, 'i2' 

-- Как нарисовать дополнительный индекс на любое поле, если уже есть один PRIMARY KEY?
declare @t table(id1 int, id2 int, [name] varchar(25), primary key(id1, id2), unique([name]))
insert into @t
select 1, 2, 'i1' union all
select 1, 3, 'i1' 
10 июл 12, 16:02    [12845740]     Ответить | Цитировать Сообщить модератору
 Re: Помогите ускорить хранимую процедуру  [new]
yhvvh
Member

Откуда:
Сообщений: 11
попробую с индексами
10 июл 12, 16:07    [12845779]     Ответить | Цитировать Сообщить модератору
 Re: Помогите ускорить хранимую процедуру  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
yhvvh, вы уж лучше научитесь читать планы запросов. Там всё видно как на ладони, какие индексы и как связываются.

user89, а почему порядок соединения должен быть от dbo.journal_t? намного логичней что от отобранных данных @MyTableVar, их же должно быть меньше.
+
Можно ещё так:
UPDATE	J
SET	 kolsklad	= kolsklad - W.kol_t
	,statusdoc	= 2
	,namesotr	= NULL
	,codesotr	= NULL
	,idreason	= NULL
FROM	     @MyTableVar	W
	JOIN dbo.journal_t	J ON J.idtovar = W.id_tov
				 AND J.iddoc1  = W.id_doc
OPTION (FORCE ORDER)
Указать хинт FORCE ORDER
10 июл 12, 16:56    [12846214]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить