Хорошо, я понимаю, что это довольно расплывчатый вопрос, но потерпите меня.
Я неоднократно сталкивался с этой проблемой при разных и не связанных запросах. Выполнение запроса ниже занимает много минут:
SELECT <Fields>
FROM <Multiple Tables Joined>
LEFT JOIN (SELECT <Fields> FROM <Multiple Tables Joined> ) ON <Condition>
Однако, просто добавив подсказку соединения, он запрашивает выполнение за считанные секунды:
SELECT <Fields>
FROM <Multiple Tables Joined>
LEFT HASH JOIN (SELECT <Fields> FROM <Multiple Tables Joined> ) ON <Condition>
Странно то, что тип JOIN, указанный в подсказке, не совсем улучшает производительность. Это происходит потому, что подсказка заставляет оптимизатор выполнить подзапрос изолированно и затем присоединиться. Я вижу такое же улучшение производительности, если я создаю табличную функцию (не встроенную) для подзапроса. например,
SELECT <Fields>
FROM <Multiple Tables Joined>
LEFT JOIN dbo.MySubQueryFunction() ON <Condition>
У кого-нибудь есть идеи, почему оптимизатор такой тупой в этом случае?