Перед тем, как увидеть план выполнения или табличные индексы, я дам наиболее образованные догадки. Во-первых, вот пара ссылок, которые стоит прочитать.
оператор showplan недели - ленивая шпуля
Катушка стола / Ленивая шпуля
INDEXING : посмотрите на ваши индексы, чтобы убедиться, что все они охватывают столбцы, которые вы выбираете из таблиц. Вы захотите получить все столбцы, включенные в предложения JOINs и WHERE в индексах. Все остальные столбцы, которые есть в инструкциях SELECT, должны быть включены или включены в индекс.
ОПЕРАТОРЫ : посмотрите, сможете ли вы избавиться от операторов, не равных ("<>"), в пользу одного оператора, большего или меньшего, чем оператор. Может ли это утверждение and T.CurrentHorizon <> 0
быть изменено на это and T.CurrentHorizon > 0
?
JOINS : избавиться от подзапросов, которые присоединяются к таблицам вне себя. Например, эта строка and FV2.elementId = FV.elementID
может вызывать некоторые проблемы. Нет причины, по которой вы не можете переместить это из подзапроса в JOIN на dbo.aowCollectedFact FV
, учитывая, что вы уже группируете (DISTINCT) в основном запросе.
DISTINCT : измените его на GROUP BY. У меня нет другой причины, кроме как, потому что это хорошая практика и занимает две минуты.
ПОСЛЕДНЕЕ ПРИМЕЧАНИЕ : Исключением из всего вышеперечисленного может быть оставление последнего подзапроса, IF NOT EXISTS
, в качестве подзапроса. Если вы измените его на JOIN, это будет оператор LEFT JOIN...WHERE NULL
, который на самом деле может вызвать операции буферизации. Нет лучшего способа обойти это.