Я обнаружил, что слишком большой запрос можно оптимизировать, разбив его на два или более запросов, а промежуточные результаты сохраняются во временных таблицах. Я не знаю строгих правил, когда запрос становится слишком большим; простые «последовательные» внутренние объединения из 20 таблиц могут быть оптимизированы должным образом, причём причудливые запутанные объединения на 8 таблицах могут оказаться неудачными. Когда это происходит, в общем, я стараюсь «вытянуть» как можно больше в первый запрос для работы с «маленькими» таблицами и вернуть как можно меньший набор данных во временную таблицу, а затем использовать его в Второй запрос для обработки «больших» таблиц. («Малый» и «большой», конечно, полностью связаны с вашей ситуацией.)
Эмпирическое правило, которое я придумал, чтобы объяснить это, заключается в том, что некоторые запросы могут просто стать слишком большими или слишком сложными для любого «универсального» алгоритма «один размер подходит всем», чтобы иметь возможность создать оптимальный план запроса. в течение разумного промежутка времени. Короче говоря, хотя по большому счету вы можете писать запросы как один большой кусок, часто имеет смысл разбить их на управляемые куски. (Я знаю, что читал статьи на эту тему в прошлом, но эта тема встречается не слишком часто, и я не могу вспомнить, когда или где я их читал.)