Корректировка плана запроса MS SQL

Подскажите пожалуйста, как можно решить проблему.

Есть довольно сложное представление, состоит из CTE, union и 7 join. Само по себе выполняется за 2 секунды и это устраивает. Но когда его соединяю (join) с еще одной таблицей - выполняется уже более 30 минут. Проверяю планы запроса в обоих случаях - они совершенно разные. Во втором случае есть Nested Loops, который берет данные из индекса (index seek) и по этому индексу прочитано 10 млрд строк, но на выходе всего 15 тыс строк, а в самом индексе всего 27 млн строк. Соединение данных с таблицей в плане запроса происходит спустя еще 5 этапов плана, соответственно такое исполнение плана не является обязательным.

В первом же случае, когда выполняется только одно представление тоже читается этот индекс и собирается в Hash Match. При этом из индекса читается всего 59 тыс строк и на выходе перед Hash Match 25 тыс строк.

Простым поиском по интернету, как решить проблему не нашел.

Можно ли как-то указать оптимизатору использовать для представления план запроса самого представления? Или может указать оптимизатору порядок или тип соединения объектов?

Запрос представления, который выполняется 2 сек:

SELECT act_reg_id, service_time, assyst_usr_id,assyst_usr_n, email,
serv_dept_id, serv_dept_sc, rincident_id, tdincident_id, num_td,
date_actioned,  pererabotka, is_ft, Df_GROUP, Act_GROUP,grade_id 
FROM [act_r_b] 
WHERE date_actioned between '2024-02-12' and '2024-02-16'

Запрос с добавлением таблицы:

SELECT ar.act_reg_id, ar.service_time, ar.assyst_usr_id, ar.assyst_usr_n, ar.email, ar.serv_dept_id, ar.serv_dept_sc, 
ar.rincident_id, ar.tdincident_id, ar.num_td, ar.date_actioned, 
ar.pererabotka, ar.is_ft, ar.Df_GROUP, ar.Act_GROUP,
g.salary1,g.salary1_1,g.salary2,g.salary2_1
FROM [act_r_b] ar 
INNER JOIN #gradetmp g ON g.id = ar.grade_id AND g.[start_date] < ar.date_actioned AND g.[end_date]>ar.date_actioned
where ar.date_actioned between '2024-02-12' and '2024-02-16'

#gradetmp таблица с 25 тыс строк.


Ответы (1 шт):

Автор решения: Николай Чичиков

Hint помог. Может и не лучшее решение, но мою проблему решило. В нужном месте представления поставил INNER HASH JOIN, и результирующий запрос стал выполняться 4 секунды вместо 30 минут.

→ Ссылка