Порядок выполнения запроса на where и view в SQL server
Всем Привет,
У меня есть сложное представление, которое имеет 6 таблиц внутренних соединений и максимальную функцию на нем.
Из 6 таблиц только в одной таблице содержится 100 миллионов простых данных (без полей).
Я запускаю один запрос, который выглядит так
Select * from ComplexView where id in (Select id from AnotherView where dt between 'somedate' to 'someotherdate')
Я проверил индексы и статистику для всех базовых таблиц, которые используются в ComplexView,и все они имеют среднюю фрагментацию менее 10% .
Когда я запускаю этот запрос, это занимает более 2 часов. Но если я перестрою индексы и обновлю статистику,
он дает результат через 10 секунд. Кое-как, через некоторое время (в prod) его снова берут на 2 часа.
ComplexView:
Выберите id, max(case )
из таб1.... таб6 (все внутренние соединения r)
группа по идентификатору
Видя план выполнения, я запутываюсь, является ли сначала его выполнение условием where или логикой просмотра.
В общем случае, где предложение будет рассмотрено в первую очередь или просмотр выполнения в первую очередь?
Может ли кто-нибудь, пожалуйста, подсказать, что может быть причиной проблемы perf?. Без изменения вида и без перестройки индексов каждые 2 часа.??
Заранее спасибо
Что я уже пробовал:
Для целей тестирования я просто использую результирующий набор
Select id from AnotherView where dt between 'somedate' to 'someotherdate'во временную таблицу и выполните следующий запрос
Select * from ComplexView where id in (select id from #tmp)
это продолжалось почти 30 секунд.