В вашем сценарии лучший способ сделать это - просто запустить компоненты по отдельности. Имейте в виду, что приведенное ниже относится в первую очередь к настройке времени выполнения (в среде с низким уровнем непредвиденных обстоятельств / параллелизмом). У вас могут быть другие приоритеты при большой одновременной нагрузке.
Мне приходится регулярно делать очень похожую разбивку для разных процедур, которые я должен настроить. Как правило, общая методология, которой я придерживаюсь:
1 - выполнить базовый прогон
2 - Добавьте команды PRINT
или RAISERROR
между частями, которые возвращают текущее время, чтобы помочь определить, какие шаги занимают больше всего времени.
3 - Разбивать запросы по отдельности. Обычно я запускаю порции самостоятельно (без учета условий JOIN
), чтобы увидеть, что такое дисперсия. Если это очень длительный запрос, вы можете добавить предложение TOP
к любому SELECT
s, чтобы ограничить возврат. Пока вы последовательны, это все равно даст вам хорошую идею.
4 - настроить компоненты из шага 3, которые занимают больше всего времени. Если у вас есть сложные подзапросы, возможно, сделайте их индексированными #temp
таблицами, чтобы посмотреть, поможет ли это. CTE
s, как правило, никогда не помогают производительности, поэтому вам, возможно, придется их материализовать.