Запросы без хорошего плана найдено

20

У меня есть база данных SQL Server 2012. Я заметил значение Reason for early termination of statement optimizationдля некоторых запросов и все дал Good Enough Plan Found. Теперь мои вопросы:

  1. Каковы все возможные типы «Причины досрочного прекращения оптимизации выписки». Я искал это в msdn, но не получил полный список значений.
  2. Существует ли DMV или расширенное событие для перечисления всех запросов, для которых оптимизация была прекращена по причинам, отличным от найденного хорошего плана? Я ссылался на следующие две статьи, в которых не приводится полный список возможностей. Кроме того, они дают мне другой результат в моей базе данных.

введите описание изображения здесь

LCJ
источник

Ответы:

20
  • Превышен лимит памяти

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

  • Время истекло

    Эта причина очень неправильно понята .

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

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

    Если этот бюджет превышен на одном из этапов поиска, этап заканчивается. Это является частью дизайна и нормальной работы оптимизатора. Запросы, которые требуют большего количества усилий оптимизатора, получают это; те, которые этого не делают.

    Думайте о «Тайм-аут» как «Достаточно хороший план найден».

  • Достаточно хороший план найден

    Это означает то же самое, что и пустая причина. Это просто историческая особенность, что планы с стоимостью ниже 0,909090 ... (1 / 1,1) помечаются таким образом. Ничто не останавливается рано или иным образом специально не обрабатывается или отличается в коде оптимизатора, когда появляется эта причина.

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

Совет

Целевые усилия по настройке запросов, основанные на реальных показателях производительности (затраченное время, загрузка ЦП / памяти, ... все, что важно в контексте). Если запрос слишком медленный для своей цели, потратьте время на его ускорение. Измерьте фактическую производительность, сравните ее с базовой линией и историей, а также настройте усилия на важные отклонения.

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

Пол Уайт говорит, что GoFundMonica
источник
10

Если вы перейдете на http://schemas.microsoft.com/sqlserver/2004/07/showplan/showplanxml.xsd (эту ссылку вы увидите, если откроете план выполнения в формате XML), вы увидите перечислены три причины, а именно:

  • TimeOut
  • MemoryLimitExceeded
  • GoodEnoughPlanFound

Статьи, которые вы упоминаете, кажутся подходящими для нахождения этих событий, у вас есть конкретная проблема? Единственное, что нужно иметь в виду, это то, что эти DMV не фиксируют все команды SQL, когда-либо выполнявшиеся на сервере, и сбрасываются при перезагрузке сервера. Вы можете перехватить showplan xml с помощью Extended Events и запросить это, но мне это кажется излишним.

Я бы не стал слишком беспокоиться о GoodEnoughPlanFound, похоже, оптимизатор хорошо справляется со своей задачей (быстро найти хороший план).

НТН

wBob
источник