Корректировка плана запроса 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 минут.