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

Откуда: из России
Сообщений: 901
Есть таблицы :
таблица1 синхронизации с счетчиком синхронизации( миллионы записи в таблице)
исходная таблица2 что -то вроде справочника,
есть таблица 3 , где хранится тек. максимальный счетчик
Есть процедура которая делает обновления таблицы 2 на основание данных таблицы 1 максимального счетчика для каждого элемента из таблицы 2.

Создал фильтрованный индекс на таблицу 1 с фильтром>n.
в процедуре прописал этот же фильтр,-> индекс используется, план выполнения устраивает(план 1)
со временем, примерно за неделю, когда данных много добавилось в таблицу 1, процедура начинает использовать другой план (план 2)выполнения, где план отвратительный, по колличеству перебору данных(т.к в процедуре есть еще row_number на строки из таблицы 1).

что я делаю - периодически меняю значение счетчика в процедуре, пока вручную, но можно сделать и автоматически.
хотел сделать, использовать переменную на значение максимально счетчика, но т.к значение переменной неизвестно, то сикуль строит универсальный план (план 2) для процедуры с учетом различных значений переменной.

Вообще, это нормально так делать, т.е подпиливать процедуры под использование конкретого индекса, когда процедура сначало использует план 1 потом начинает план 2?
либо как поступаете вы у себя в такие ситуации?

ps: ms sql 2008 r2 ent.ed, статистика регулярно обновляется.
16 авг 11, 11:43    [11125107]     Ответить | Цитировать Сообщить модератору
 Re: изменение плана выполнения процедуры.  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
Slava_Nik
что я делаю - периодически меняю значение счетчика в процедуре, пока вручную, но можно сделать и автоматически.
хотел сделать, использовать переменную на значение максимально счетчика, но т.к значение переменной неизвестно, то сикуль строит универсальный план (план 2) для процедуры с учетом различных значений переменной.


declare @max_counter int
set @max_counter = ...
 
select * from MyTable 
where counter = @max_counter  option ( optimize for ( @max_counter unknown ) )

?
16 авг 11, 12:38    [11125652]     Ответить | Цитировать Сообщить модератору
 Re: изменение плана выполнения процедуры.  [new]
Slava_Nik
Member

Откуда: из России
Сообщений: 901
Knyazev Alexey,
да вот думаю об этом.

я так понял, можно в самом запросе прописать optimize
и можно саму процедуру прописать к плану с помощью sp_create_plan_guide.

и как понять @max_counter unknown - т.е использовать план с оптимизацией для переменной @max_counter,
соответсвенно оптимазатор создаст план пригодный как и для значений больше, значения в моем фильтрованном индексе, и для перенной меньше моего фильтра, и поэтому он создасть универсальный план, который не будет использовать мой индекс.
соответственно нужно прописать процедуру к плану. так получается?

либо, можно еще использовать подсказку на использование моего индекса, так?
16 авг 11, 13:48    [11126239]     Ответить | Цитировать Сообщить модератору
 Re: изменение плана выполнения процедуры.  [new]
Slava_Nik
Member

Откуда: из России
Сообщений: 901
declare @max_counter int
set @max_counter = ...
 
select * from MyTable 
where counter = @max_counter  option ( optimize for ( @max_counter unknown ) )

начал разбираться с этим, но не пойму, как сделать
У меня же set @max_counter = ... каждый раз значение будет разное сейчас 100, через час 105 и т.д,как sql сделает этот план?
Сейчас пытался сделать такое, так он и создает универсальный план с учетом всех значений, который не очень.
23 авг 11, 18:05    [11166555]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить