Какие правила определяют, когда SQL Server использует CTE в качестве «области оптимизации»?

10

Некоторое время назад Брент Озар опубликовал статью, в которой подробно описываются некоторые различия между SQL Server и PostgreSQL:

Два важных различия между SQL Server и PostgreSQL

Первый момент («CTE - это заборы для оптимизации») попался на глаза, поскольку очевидно, что в представленном примере SQL Server объединяет CTE и основной запрос и оптимизирует его как один запрос (в отличие от противоположного поведения в PostgreSQL).

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

Лучший способ выбрать звезду

Таким образом, кажется, что SQL Server «чтит» CTE как забор оптимизации ИНОГДА. Существуют ли какие-либо полезные ресурсы, которые документируют конкретный список известных случаев, когда SQL Server надежно соблюдает CTE как забор для оптимизации (или наоборот)?

Брайан Ребок
источник

Ответы:

10

... список известных случаев, когда SQL Server надежно соблюдает CTE как забор для оптимизации

Любой такой список будет опираться на наблюдаемое поведение без гарантии надежности.

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

CTE обрабатываются очень похоже на представления / встроенные функции / подзапросы / производные таблицы и встраиваются в запрос. Любое наблюдаемое «заборное» поведение зависит от того, оптимизатор не может или не хочет оптимизировать через эту принципиально проницаемую границу.

Вообще говоря, чем проще и более «реляционный» CTE, тем более вероятно, что оптимизатор сможет перемещать биты.

Были предложены функции, которые позволили бы оптимизатору рассмотреть или заставить его реализовать «результат» CTE, но еще не реализованы:

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

Пол Уайт 9
источник