Сотрудник попросил меня посмотреть индексирование для некоторых таблиц, потому что его запрос выполнялся очень долго. Более часа.
select count(1)
from databaseA.dbo.table1
inner join databaseA.dbo.table2 on (table1.key = table2.key)
inner join databaseB.dbo.table3 on (table1.key = table3.key)
Обратите внимание на разные базы данных. Это запускалось из базы данныхB
В таблицах 1 и 2 было более 2 миллионов записей. В Table3 было около десятка записей или около того.
Я посмотрел на план запроса, и оптимизатор решил выполнить поиск индекса по вложенным циклам в таблицах 1 и 2 с таблицей 3 в качестве движущей таблицы!
Мое первое предположение состояло в том, что статистика была серьезно испорчена в таблицах 1 и 2, но перед обновлением статистики я попытался добавить подсказку о соединении таким образом:
select count(1)
from databaseA.dbo.table1
inner HASH join databaseA.dbo.table2 on (table1.key = table2.key)
inner join databaseB.dbo.table3 on (table1.key = table3.key)
Результаты возвращаются через 15 секунд.
Так как у меня было мало времени, я передал результаты ему, но я боюсь, что это может привести к проблемам в будущем.
Должен ли я вернуться к проблеме статистики и решить ее таким образом? Может ли неправильный план запроса быть результатом объединения из отдельных баз данных?
Может кто-нибудь предложить мне несколько идей, основанных на вашем опыте?