Многоцелевая хранимая процедура: как узнать, какой оператор стабилен? - PullRequest
0 голосов
/ 06 мая 2020

В этом сообщении блога Кимберли Л. Трипп описывает лучший способ создания многоцелевой хранимой процедуры. Лучший способ, как она упоминает, - использовать option(recompile), когда оператор нестабилен, чтобы план выполнения не помещался в кеш, и sp_executesql, когда мы знаем, что оператор стабильный и это зависит от типа переданного столбца. к утверждению.

Мой вопрос заключается в том, как мы узнаем, стабильно ли утверждение на основе столбца?

1) Если мой оператор стабильный, когда я указываю столбец будет ли он стабильным, если я укажу этот столбец рядом с другими столбцами?

2) Если столбец является очень избирательным (их значения разные, мы можем узнать это из вектора плотности с низким значением AllDensity colmun) означает ли это автоматически, что оператор, имеющий этот столбец, является стабильным?

1 Ответ

0 голосов
/ 06 мая 2020

На самом деле это не простой вопрос. Есть много аспектов, которые влияют на стабильность плана, что кэшируется и как избежать ненужной перекомпиляции. Самая большая проблема в том, что вы описываете, - это то, как оценки мощности различаются на основе статистики. Например, если я хочу получить клиентов с такими именами, как A%, это может полностью отличаться от клиентов с такими именами, как D%, и сильно отличаться даже от AB%. Значение параметра может иметь большое влияние на определение подходящего плана. Это влияет на все параметры. Итак, что вы пытаетесь оценить, если разные значения параметров приведут к совершенно разным планам.

Для подробного описания того, как это работает, я написал технический документ MSDN еще в 2012 году, а это 8 лет go, ничего в том, о чем вы спрашиваете, существенно не изменилось. Вы найдете его здесь: https://blog.greglow.com/2013/03/17/whitepaper-plan-caching-and-recompilations-in-sql-server-2012/

Я надеюсь получить шанс в этом году обновить его до последних версий.

...