Что ни говори, а это очень важно — дать объекту точное название. Как написал в моем блоге Майк Диммик, термин «Предполагаемые планы выполнения» (Estimated Execution Plans) сбивает людей с толку. Когда вы собираетесь генерировать планы выполнения, вы можете назвать их на выбор предполагаемыми или фактическими. Ну скажите на милость, кому нужны предполагаемые меры, когда вы можете предпринять действия реальные? В данном случае наименование «предполагаемый план выполнения» никуда не годится.

Предполагаемый план выполнения представляет собой полный план выполнения. Это не предположение, можете убедиться в этом сами. Возьмем базовый запрос:

SELECT  *
FROM    Production.Product AS p
JOIN    Production.ProductSubcategory AS ps
        ON ps.ProductSubcategoryID =
        p.ProductSubcategoryID
JOIN    Production.ProductCategory AS pc
        ON pc.ProductCategoryID =
        ps.ProductCategoryID
WHERE   pc.Name = ‘Clothing’;

Если вы поместите этот запрос в среду SQL Server Management Studio и нажмете комбинацию клавиш Ctrl-L, то получите план выполнения, показанный на рисунке 1.

 

Предполагаемый план выполнения
Рисунок 1. Предполагаемый план выполнения

Это предполагаемое выполнение. Кроме того, это и финальный план выполнения. Если вы нажмете на клавиатуре комбинацию клавиш Ctrl-M и затем выполните запрос, то получите набор результатов и следующий, уже фактический план выполнения (см. рисунок 2).

 

Фактический план выполнения
Рисунок 2. Фактический план выполнения

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

При очень внимательном рассмотрении вы можете заметить в упомянутых графических планах одно различие. Конвейер, представляющий поток данных между оператором Nested Loops и выполняемой в таблице ProductCategory операцией Clustered Index Seek, оказывается фактически чуть более «толстым» (см. рисунок 3).

 

Отличие в размерах конвейера
Рисунок 3. Отличие в размерах конвейера

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

  • RuntimeCountersPerThread;
  • ActualRows;
  • ActualEndOfScans;
  • ActualExecutions.

Вот и все. Упомянутые свойства фиксируются только во время выполнения. В нашем графическом плане предполагаемое число строк составляет 1, а фактическое число — 8. Это и объясняет весьма незначительное различие в размерах конвейера. Вы можете убедиться в этом, проверив свойства оператора (см. рисунок 4).

 

Свойства оператора плана
Рисунок 4. Свойства оператора плана

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

Прошу понять меня правильно. Фактические планы исключительно полезны, так как содержат данные, связанные со временем выполнения. Допустим, оптимизатор полагал, что извлечет одну строку данных, а фактически извлек 100, 1000 или 1 млн строк. Так вот, знать об этом чрезвычайно важно при выполнении настройки запроса. Но остальные сведения, получаемые нами из планов выполнения, идентичны. Вот почему не следует отказываться от использования предполагаемых планов выполнения.