Есть ли способ предотвратить обрезку структуры памятки?

8

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

zli89
источник
3
Непонятно, что вы хотите предотвратить. Хотите ли вы каким-то образом заставить оптимизатор рассчитать стоимость для всех возможных планов (которая может составлять триллионы миллиардов, даже для простого запроса с 10 объединениями)?
ypercubeᵀᴹ
да, хотя это кажется невозможным. Я хотел бы заставить оптимизатор рассмотреть все возможные планы, рассчитать их стоимость, а затем выбрать самый дешевый.
zli89
4
И зачем это делать? Если он рассчитал, скажем, план со стоимостью = 7, а затем обнаружил, что любой включающий план a hash join bбудет стоить 10 или более, зачем рассчитывать все эти миллионы планов и не сокращать их? (не то, чтобы оптимизатор работал таким упрощенным способом)
ypercubeᵀᴹ

Ответы:

12

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

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

Предотвращение обрезки и удаления обычно приводит к (намного) более длительному времени компиляции без значительного улучшения качества окончательного плана, если таковое имеется.

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

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

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

Я не знаю ни ручки, ни флага трассировки, чтобы каким-либо образом принудить это поведение (хотя Пол Уайт упоминает здесь некоторые флаги трассировки, которые обеспечивают большую наглядность и позволяют использовать некоторые дельты поведения ).

Microsoft предоставляет много оружия, но это почти гарантированно будет указывать прямо на ваши ноги в 100% случаев. При первом запуске запроса я не думаю, что вы хотите, чтобы SQL Server тратил бесконечное количество времени на создание каждого возможного варианта плана, чтобы получить желаемые результаты. Как упоминает @ypercube, это может быть очень большое количество планов, и это отчасти побеждает цель выполнения запроса. Предположительно, ваша цель при запуске запроса - вернуть данные в какой-то момент, верно? И «некоторая точка» должна находиться в определенных пределах, поскольку для определенных слоев вашего приложения будут установлены различные таймауты запросов / команд, а пользователи будут ждать так долго, пока страница загрузится ...

Аарон Бертран
источник