Я согласен со всеми, кто сказал, что одно соединение, вероятно, будет более эффективным, даже с большим количеством таблиц. Это также меньше усилий по разработке, чем выполнение работы в коде приложения. Это предполагает, что таблицы соответствующим образом проиндексированы, с индексом для каждого столбца внешнего ключа и (конечно) индексом для каждого столбца первичного ключа.
Лучше всего сначала попробовать самый простой подход (большое соединение) и посмотреть, насколько хорошо он работает. Если он работает хорошо, то отлично - все готово. Если он работает плохо, профилируйте запрос и найдите недостающие индексы в ваших таблицах.
Ваш вариант № 1 вряд ли будет работать хорошо из-за количества сетевых обращений (как уже упоминалось). Это иногда называют проблемой «select N + 1» - вы делаете один SELECT, чтобы получить список из N приложений, а затем делаете N SELECT в цикле, чтобы получить клиентов. Эта циклическая запись естественна для программистов приложений; но SQL работает намного лучше, когда вы работаете с целыми наборами данных одновременно.
Если опция # 2 медленная, даже при хорошей индексации, возможно, вы захотите изучить кеширование. Вы можете кэшировать в базе данных (используя сводную таблицу или материализованное / индексированное представление), в приложении (если имеется достаточно ОЗУ) или на выделенном сервере кэширования, таком как memcached. Конечно, это зависит от того, насколько актуальными должны быть результаты вашего запроса. Если все должно быть полностью обновлено, любой кэш должен обновляться всякий раз, когда обновляются базовые таблицы - это усложняется и становится менее полезным.
Это звучит как отчетный запрос, и отчетность часто не обязательно должна быть в режиме реального времени. Так что кеширование может вам помочь.
В зависимости от вашей СУБД, еще одна вещь, о которой стоит подумать, это влияние этого запроса на другие запросы, попадающие в ту же базу данных. Если ваша СУБД позволяет читателям блокировать средства записи, тогда этот запрос может помешать обновлению таблиц, если для его выполнения требуется много времени. Это было бы плохо. У Oracle нет этой проблемы, как и у SQL Server, когда он работает в режиме чтения зафиксированного снимка. Я не знаю о MySQL, хотя.