Published on

August 25, 2014

Понимание параметрического затравочного в SQL Server

Добро пожаловать на третий пост в нашей серии “Параметризация”. В предыдущем посте мы кратко упомянули концепцию параметрического затравочного в SQL Server. Сегодня мы углубимся в эту тему и рассмотрим все важные детали о параметрическом затравочном.

Прежде чем мы начнем, давайте вспомним, что мы уже узнали. В SQL Server пакет может быть либо параметризованным, либо нет. Параметризованный план пакета может быть двух типов: “Prepared” или “Proc”. “Prepared” план соответствует выполнению sys.sp_executesql с по крайней мере одним параметром, в то время как “Proc” план соответствует хранимой процедуре. Параметрическое затравочное ведет себя одинаково для обоих типов планов, поэтому для целей этого поста мы сосредоточимся на параметризованных пакетах независимо от их типа.

Итак, что же такое параметрическое затравочное? Когда пакет содержит один или несколько параметров и требует оптимизации, оптимизатор знает значения этих параметров в конкретном выполнении. Это позволяет оптимизатору использовать эти значения для оценки количества возвращаемых строк на каждом шаге плана. По сути, это то же самое, что если бы значения были жестко закодированы в тексте пакета. Это мощная функция, потому что она помогает оптимизатору делать более точные оценки, что приводит к лучшим планам выполнения и улучшенной производительности.

Когда пакет выполняется впервые после перезапуска сервера, он запускает процесс компиляции. Во время этой компиляции значения параметров используются для генерации плана выполнения через параметрическое затравочное. Затем план сохраняется в кэше планов для повторного использования. В следующий раз, когда выполняется тот же пакет, потенциально с другими значениями параметров, используется план из кэша. Однако важно отметить, что план, используемый для второго выполнения, все еще основан на значениях из первого выполнения.

В графическом представлении фактического плана выполнения параметризованного пакета вы можете изучить свойства внешнего оператора (обычно оператор “SELECT”) и найти свойство “Parameter List”. Раскрытие этого свойства покажет вам скомпилированные значения и значение каждого параметра во время выполнения. Скомпилированное значение – это значение, используемое в процессе генерации плана, в то время как значение во время выполнения – это фактическое значение, используемое в конкретном выполнении.

Однако могут быть случаи, когда параметрическое затравочное приводит к плохой производительности. Например, если хранимая процедура выполняется с значением параметра, которое редко используется, план, сгенерированный на основе этого значения, может быть очень эффективным для этого конкретного значения, но плохо работать для большинства других значений. Возникает вопрос: является ли параметрическое затравочное хорошей или плохой вещью?

Ответ, как всегда, зависит от обстоятельств. Эффективность параметрического затравочного зависит от распределения данных. Если большинство выполнений хранимой процедуры используются с обычно используемыми значениями параметров и распределение значений в соответствующем столбце равномерно, то параметрическое затравочное полезно. Вероятно, сгенерированный план будет хорошим для большинства случаев и лучше, чем план, сгенерированный без параметрического затравочного.

С другой стороны, если распределение значений в соответствующем столбце не является равномерным, план, основанный на одном значении, может быть не подходящим для других значений. В таких случаях параметрическое затравочное может быть не выгодным.

В нашем следующем посте мы рассмотрим стратегии работы с случаями, когда параметрическое затравочное не является выгодным. Мы обсудим техники оптимизации производительности запросов и преодоления ограничений параметрического затравочного.

Следите за нашим следующим постом в серии “Параметризация”!

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.