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

Откуда:
Сообщений: 517
День добрый!
Возникла такая ситуация, есть несколько(около 20) процедур отчетов, в которых используются временные таблицы, в каждой из процедур таблицы строятся с разной логикой. Внутри каждой процедуры есть код, который обрабатывает данные из временных таблиц, строит новые таблицы и т.п. Этот код одинаковый во всех процедурах и повторяется в каждой из них(на примере находится внутри --start и -- end). Соответственно очень удобно были бы создать отдельную процедуру с этим кодом и вызывать ее из процедур отчетов.
Так в принципе и сделали, до меня, и оно даже работает. Но! Эту внутреннюю процедуру невозможно запустить автономно, скажем для улучшения производительности, каких-либо изменений и т.п. Внутренняя процедура содержит более тысячи строк кода, поэтому работать с ней практически невозможно. Хотелось бы узнать, как можно оптимизировать такую ситуацию.
Вот грубый пример:
Create Procedure Pr_Report1
(
	@a				AS NVARCHAR(MAX),
	@b			AS UNIQUEIDENTIFIER
)
AS
BEGIN
...
Create table #t (id int, col1 int, col2 nvarchar(10)
insert into #t select ... from table1 where...

--start
select * into #tt
from table2 inner join #t on...
...
delete from #t where...

--end

select...
from #t where...
...
END
25 июл 17, 10:05    [20672042]     Ответить | Цитировать Сообщить модератору
 Re: Процедура из процедуры, как оптимизировать?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30813
abrashka
Хотелось бы узнать, как можно оптимизировать такую ситуацию.
Так в чём проблема? Запускаете отчётную внешнюю процедуру для отладки внутренней.
25 июл 17, 10:36    [20672155]     Ответить | Цитировать Сообщить модератору
 Re: Процедура из процедуры, как оптимизировать?  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
abrashka
Эту внутреннюю процедуру невозможно запустить автономно, скажем для улучшения производительности, каких-либо изменений и т.п.

Это почему? Из-за временных таблиц?
Если так, то в чем проблема создать аналогичные временные таблицы при запуске внутренней процедуры автономно?
25 июл 17, 10:47    [20672198]     Ответить | Цитировать Сообщить модератору
 Re: Процедура из процедуры, как оптимизировать?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30813
Minamoto
Если так, то в чем проблема создать аналогичные временные таблицы при запуске внутренней процедуры автономно?
При отладке неудобно создавать десятки таблиц и заполнять их правильными (для отладки) данными.
ИМХО удобнее всего просто вызывать внешнюю процедуру, это ничуть не менее удобно, чем вызывать отлаживаемую процедуру из своего скрипта.
25 июл 17, 10:53    [20672219]     Ответить | Цитировать Сообщить модератору
 Re: Процедура из процедуры, как оптимизировать?  [new]
abrashka
Member

Откуда:
Сообщений: 517
Да, вопрос именно удобства.
В принципе все работает, но что-то мне подсказывает, что так делать не правильно...

Речь идет об относительно больших процедурах, 2-3 тысячи строк в каждой.

Я не могу даже посмотреть execution plan внутренней процедуры. На каком-то этаме планы в SSMS уже не отображаются.
25 июл 17, 11:05    [20672272]     Ответить | Цитировать Сообщить модератору
 Re: Процедура из процедуры, как оптимизировать?  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
alexeyvg
Minamoto
Если так, то в чем проблема создать аналогичные временные таблицы при запуске внутренней процедуры автономно?
При отладке неудобно создавать десятки таблиц и заполнять их правильными (для отладки) данными.
ИМХО удобнее всего просто вызывать внешнюю процедуру, это ничуть не менее удобно, чем вызывать отлаживаемую процедуру из своего скрипта.
Часто это легче, чем вызывать внешнюю процедуру, которая еще кучу всего выполняет, кроме того, если временные таблицы создаются во внешней процедуре, то после ее выполнения они уничтожатся, а при отладке хочется посмотреть - что в них лежит.
Так что решение за автором - как ему удобнее и проще поступать.
25 июл 17, 11:09    [20672282]     Ответить | Цитировать Сообщить модератору
 Re: Процедура из процедуры, как оптимизировать?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7403
В общем-то достаточно один раз написать код заполнения таблиц. Первый раз сложно, но затем достаточно использовать наработки.
Кроме того, при юнит-тестировании не всегда требуется заполнять все таблицы, что упрощает задачу. А вот при вызове процедуры наверняка потребуется заполнить все, которые принимают участие.
25 июл 17, 11:23    [20672333]     Ответить | Цитировать Сообщить модератору
 Re: Процедура из процедуры, как оптимизировать?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30813
abrashka
В принципе все работает, но что-то мне подсказывает, что так делать не правильно...
Вы как раз вызываете процедуру так, как надо, это совершенно правильно для отладки.

abrashka
Я не могу даже посмотреть execution plan внутренней процедуры. На каком-то этаме планы в SSMS уже не отображаются.
Так смотрите профайлером.
Фильтр на SPID окошка SSMS, события внутри процедур - и всё будет прозрачно и удобно, и вся эта конструкция будет работать весь рабочий день, никому не мешая.
25 июл 17, 13:27    [20672955]     Ответить | Цитировать Сообщить модератору
 Re: Процедура из процедуры, как оптимизировать?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30813
Minamoto
alexeyvg
пропущено...
При отладке неудобно создавать десятки таблиц и заполнять их правильными (для отладки) данными.
ИМХО удобнее всего просто вызывать внешнюю процедуру, это ничуть не менее удобно, чем вызывать отлаживаемую процедуру из своего скрипта.
Часто это легче, чем вызывать внешнюю процедуру, которая еще кучу всего выполняет, кроме того, если временные таблицы создаются во внешней процедуре, то после ее выполнения они уничтожатся, а при отладке хочется посмотреть - что в них лежит.
Так что решение за автором - как ему удобнее и проще поступать.
Да, возможность посмотреть - это важно, тут придётся поступиться простотой вызовов.
25 июл 17, 13:28    [20672958]     Ответить | Цитировать Сообщить модератору
 Re: Процедура из процедуры, как оптимизировать?  [new]
abrashka
Member

Откуда:
Сообщений: 517
alexeyvg,
Большое спасибо!
Как-то не задумывался о просмотре плана через профайлер.
Т.е. нужно выбрать в профайлере ShowPlanAll, для привычного(графического) просмотра плана?
25 июл 17, 13:32    [20672971]     Ответить | Цитировать Сообщить модератору
 Re: Процедура из процедуры, как оптимизировать?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30813
abrashka
Т.е. нужно выбрать в профайлере ShowPlanAll, для привычного(графического) просмотра плана?
Да забываю всё время, у меня всё в шаблонах, попробуйте сами :-) Вроде да, ShowPlanAll.
Кстати, после настройки сохраните шаблон, будет просто использовать, только менять SPID.
25 июл 17, 13:35    [20672980]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить