Попробуйте сначала запустить подвыборы, отправив вывод каждого из них в свою таблицу.
Обновление статистики по таблицам. Затем запустите оставшуюся часть SQL, заменив исходные подвыборы таблицами, созданными на первом шаге.
Обрабатывайте несколько уровней вложения одинаково: каждый слой является отдельной вставкой в другую таблицу.
Я обнаружил, что оптимизаторам запросов сложно работать со сложным SQL. Разделение подзапросов на отдельные шаги часто решает эту проблему.
Между прогонами я предпочитаю оставить данные нетронутыми в качестве ссылки в случае необходимости отладки, а затем обрезать таблицы в качестве первого шага прогона.
Ответ на комментарии ластика
Предполагается, что ваш исходный запрос принимает следующую общую форму:
select [columns] from
(-- subquery
select [columns] from TableA
) as Subquery
from TableB
where mainquery_where_clause
Re-запись:
-- Create a table to handle results for your subquery:
Create Table A ;
-- Update the data distribution statistics:
update stats (TableA) ;
-- Now run the subquery:
insert into SubQTable select [columns] from TableA
-- Now run the re-written main query:
Select [columns]
from TableA, TableB
where TableA.joincol = TableB.joincol
and mainquery_where_clause ;
Я заметил некоторые синтаксические проблемы с опубликованным вами SQL. Похоже, что-то упущено. Но принцип моего ответа остается прежним. Обратите внимание, что применение моего предложения может не помочь, поскольку в вашем сценарии потенциально много переменных; Вы упомянули подзапросы, поэтому я решил обратиться к этому.
Идея Хальфера отличная: отредактируйте исходный вопрос, добавив код SQL и поместив его в "{}", предоставленный инструментом редактирования текста.
Я настоятельно рекомендую вам получить план выполнения SQL и опубликовать результаты.