Мы знаем, что структура памятки сокращена, а некоторые дорогие альтернативные планы отбрасываются при оптимизации. Мне было интересно, есть ли способ предотвратить это и позволить оптимизатору просто рассмотреть каждый возможный план и выбрать лучший из всех альтернатив?
sql-server
optimization
zli89
источник
источник
a hash join b
будет стоить 10 или более, зачем рассчитывать все эти миллионы планов и не сокращать их? (не то, чтобы оптимизатор работал таким упрощенным способом)Ответы:
Есть, но я не публикую это, потому что это будет неправильно понято и неправильно использовано. В любом случае это не приведет к исчерпывающему поиску пространства плана, потому что реализован только ограниченный набор преобразований (которые обычно дают хорошие результаты).
Предотвращение обрезки и удаления обычно приводит к (намного) более длительному времени компиляции без значительного улучшения качества окончательного плана, если таковое имеется.
В конечном счете, этот вопрос является естественным и разумным, но он основан на неправильном понимании целей оптимизатора запросов SQL Server: он предназначен для быстрого поиска хороших планов для распространенных запросов. Он не построен на основе, предназначенной для исчерпывающего поиска.
Если вы столкнулись с реальной ситуацией, которая выиграла бы от другого подхода к оптимизации, вы могли бы обосновать это на веб-сайте Connect (хотя я думаю, что вряд ли Microsoft вложит необходимые инженерные ресурсы).
источник
Я не знаю ни ручки, ни флага трассировки, чтобы каким-либо образом принудить это поведение (хотя Пол Уайт упоминает здесь некоторые флаги трассировки, которые обеспечивают большую наглядность и позволяют использовать некоторые дельты поведения ).
Microsoft предоставляет много оружия, но это почти гарантированно будет указывать прямо на ваши ноги в 100% случаев. При первом запуске запроса я не думаю, что вы хотите, чтобы SQL Server тратил бесконечное количество времени на создание каждого возможного варианта плана, чтобы получить желаемые результаты. Как упоминает @ypercube, это может быть очень большое количество планов, и это отчасти побеждает цель выполнения запроса. Предположительно, ваша цель при запуске запроса - вернуть данные в какой-то момент, верно? И «некоторая точка» должна находиться в определенных пределах, поскольку для определенных слоев вашего приложения будут установлены различные таймауты запросов / команд, а пользователи будут ждать так долго, пока страница загрузится ...
источник