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

Откуда: Москва
Сообщений: 189
Есть проблема с хранимой процедурой

Текст процедуры такой (сам текст не особо важен, можно не вдаваться):

CREATE PROCEDURE sp_calc_project 
             @project_id INT 
AS
UPDATE 
	rsl 
SET 
	rsl.cb_count=IsNull(vpscb.firm_count ,0),
	rsl.mos_count=IsNull(vpssm.firm_count ,0),
	rsl.reg_count=IsNull(vpssr.firm_count, 0)
FROM 
	rubricator_section_link AS rsl INNER JOIN
	project AS p ON p.rubricator_id=rsl.rubricator_id LEFT JOIN
	view_project_section_svres_mos AS vpssm ON (vpssm.project_id=p.id AND vpssm.section_id=rsl.section_id)  LEFT JOIN
	view_project_section_svres_reg AS vpssr ON (vpssr.project_id=p.id AND vpssr.section_id=rsl.section_id) LEFT JOIN
	view_project_section_cb AS vpscb ON (vpscb.project_id=p.id AND vpscb.section_id=rsl.section_id)  
WHERE 
	p.id=@project_id AND vpssm.project_id=@project_id AND vpssr.project_id=@project_id AND vpscb.project_id=@project_id

Проблема в том что когда это запускается запросом (прямым текстом, с объявлением переменной @project_id) это выполняется 2 сек, но когда запускаю хранимую процедуру - это выполняется больше полуминуты. Из-за чего это происходит ?


---------------------------------------
С уважением, Каримбаев Тимур
29 сен 05, 13:44    [1922732]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с хранимой процедурой  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
http://www.osp.ru/win2000/sql/dialogs/311_1_print.htm
29 сен 05, 13:45    [1922737]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с хранимой процедурой  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Почему похожие запросы имеют различные планы исполнения
29 сен 05, 13:45    [1922738]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с хранимой процедурой  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
а зачем в where дублировать то что уже стоит в условиях связи таблиц?
CREATE PROCEDURE sp_calc_project 
             @project_id INT 
AS
UPDATE 
	rsl 
SET 
	rsl.cb_count=IsNull(vpscb.firm_count ,0),
	rsl.mos_count=IsNull(vpssm.firm_count ,0),
	rsl.reg_count=IsNull(vpssr.firm_count, 0)
FROM 
	rubricator_section_link AS rsl INNER JOIN
	project AS p ON p.rubricator_id=rsl.rubricator_id LEFT JOIN
	view_project_section_svres_mos AS vpssm ON (vpssm.project_id=p.id AND vpssm.section_id=rsl.section_id)  LEFT JOIN
	view_project_section_svres_reg AS vpssr ON (vpssr.project_id=p.id AND vpssr.section_id=rsl.section_id) LEFT JOIN
	view_project_section_cb AS vpscb ON (vpscb.project_id=p.id AND vpscb.section_id=rsl.section_id)  
WHERE p.id=@project_id 
29 сен 05, 13:50    [1922772]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с хранимой процедурой  [new]
Тимур Каримбаев
Member

Откуда: Москва
Сообщений: 189
спасибо за оперативный ответ, буду смотреть

2LexusR:
в Where стоят условия потому-что они реально ускоряют выполнение запроса (в разы)

---------------------------------------
С уважением, Каримбаев Тимур
29 сен 05, 14:06    [1922888]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с хранимой процедурой  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
автор
в Where стоят условия потому-что они реально ускоряют выполнение запроса (в разы)


Ага... И превращают LEFT JOIN В INNER JOIN.
29 сен 05, 14:23    [1922980]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с хранимой процедурой  [new]
Брюлик
Member

Откуда:
Сообщений: 690
1) не называи процедуры с sp_ ,это абривиатура только для системных процедур.
2) Попробуи создать процедуру с WITH RECOMPILE
3) Если это не помогло
CREATE PROC myproc
@Par INT
AS
DCELARE @p INT
SET @p=@Par
----твои запрос здесь
29 сен 05, 14:29    [1923020]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с хранимой процедурой  [new]
Тимур Каримбаев
Member

Откуда: Москва
Сообщений: 189
pkarklin
автор
в Where стоят условия потому-что они реально ускоряют выполнение запроса (в разы)


Ага... И превращают LEFT JOIN В INNER JOIN.


:)
блин! офигеть, сам не заметил. все пытался побыстрее сделать, то одно пробовал, то другое, пока не вынес из процедуры, похоже в состоянии аффекта сделал и это, помогло сразу :) спасибо, уберу


Брюлик
1) не называи процедуры с sp_ ,это абривиатура только для системных процедур.
2) Попробуи создать процедуру с WITH RECOMPILE
3) Если это не помогло
CREATE PROC myproc
@Par INT
AS
DCELARE @p INT
SET @p=@Par
----твои запрос здесь


ок, сейчас проверю. как раз то и интересно, что это не схожие запросы, это один и тот-же запрос вызываемый по разному, так что в этой разнице (вызова) и надо искать проблему
29 сен 05, 14:37    [1923094]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с хранимой процедурой  [new]
Тимур Каримбаев
Member

Откуда: Москва
Сообщений: 189
не стал переделывать процедуру и перекомпилировать. Если использовать INNER JOIN (т.е. логика не меняется, т.к. эти условия все-равно заданы в WHERE) и процедура и запрос работают одинаково - 2 сек. Поменял немного логику (чтобы LEFT JOIN вообще не требовалось) - теперь все нормально, всем большое спасибо!

---------------------------------------
С уважением, Каримбаев Тимур
29 сен 05, 14:47    [1923163]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить