Можно ли дать оптимизатору больше времени или все, что ему нужно?

18

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

Мне было интересно, если это можно переопределить, чтобы вы могли дать оптимизатору все время в потребностях (или определенное количество миллисекунд).

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

Конечно, если у вас сложный цикл, вы должны переписать запрос, чтобы он ушел, но потерпите меня.

Это скорее вопрос из любопытства, а также из-за того, что иногда есть разница между короткозамкнутой оптимизацией и полной.

Оказывается, вы можете дать оптимизатору больше времени с помощью флага трассировки 2301. Это не совсем то, о чем я спрашивал, но это близко.

Лучшая информация, которую я нашел по этому вопросу, - это « Расширения моделирования процессора запросов» в SQL Server 2005 с пакетом обновления 1 ( I1) Иэна Хосе.

Используйте этот флаг трассировки с осторожностью! Но это может быть полезно, если придумать лучшие планы. Смотрите также:

Я думал о запросах с большим количеством объединений, в которых пространство решения для порядка объединения растет в геометрической прогрессии. Эвристика, которую использует SQL Server, довольно хороша, но мне было интересно, предложит ли оптимизатор другой порядок, если у него будет больше времени (в диапазоне секунд или даже минут).

Бакли
источник

Ответы:

16

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

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

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

Комбинируя их и применяя их (очень выборочно с помощью подсказки запроса (QUERYTRACEON 2301, QUERYTRACEON 8780), к запросу 4-уровневых встроенных TVF (где только один в нижней части будет выполнять какую-либо реальную работу, а верхние уровни будут сопоставлять результаты через подзапросы EXISTS) привели к хорошему MERGE JOIN и нескольким LAZY SPOOL, которые сократили время выполнения наполовину.

ENOTTY
источник
4

Нет, ты не можешь.

Вы можете сделать ваши запросы «дружественными к оптимизатору», понимая, как это работает (сложный зверь, не обязательно знать это наизнанку). Я бы посоветовал, что если вы что-то так критично ко времени, то исправьте запрос, а не измените работу SQL Server.

Например, вам нужно знать, когда запрос начинает масштабироваться менее эффективно, чем O (n), поскольку объем данных + распределение данных изменяется: уделение большего времени оптимизатору не добавляет здесь значения.

ГБН
источник