Хорошо, поэтому я понимаю, что это довольно неопределенный вопрос, но несите меня.
Я неоднократно сталкивался с этой проблемой с разными и несвязанными запросами. Следующий запрос занимает много минут:
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>
У кого-нибудь есть идеи, почему оптимизатор настолько тупой в этом случае?