SQL выразительный язык. На нем можно писать сложные запросы, делать различного вида джойны и получать интересные результаты при минимальных усилиях. Однако из-за того, что разработчик не имеет полного контроля над тем как выполняется запрос могут происходить очень странные вещи. Сервер баз данных строит план запроса для того, чтобы получить данные. Этот план очень сильно зависит от статистики собранной сервером. Эту статистику надо держать актуальной, но об этом нередко забывают. И на выходе мы имеем жутко неоптимальный план.

В своей практике я столкнулся с тем, что в какой-то момент из-за изменений в статистике запросы стали выполняться на 2 порядка медленней чем это было. Такое поведение совершенно неприемлимо в сколько-нибудь нагруженных системах с большим количеством пользователей. Представьте, что в пик времени продаж, запрос на оформление заказа станет выполняться в 100 раз медленнее и вы потеряете 90 процентов заказов. Эти убытки будут никак не сравнимы с теми деньгами, которые вы сэкономили на разработке благодаря выразительности SQL. По этой причине в нагруженных системах избегают сложных запросов. Пусть мы напишем больше кода, пусть потратим на это больше времени, пусть это будет даже работать медленнее, лишь бы это время было предсказуемо. Мы хотим знать сколько времени займет запрос и хотим гарантий на максимальное время запроса.

Отсюда идут запреты на использование джойнов и необходимость строить индексы по всем запросам. А без джойнов вам остаются только простые селекты, а с индексами уже и не нужен особо умный оптимизатор и если он все равно когда-нибудь решит делать полный скан таблицы, вы еще вдобавок к имеющемся ограничениям накидаете хинтов.

В принципе, такая картина видна не только в SQL. Это классическая текущая абстракция. Разработчику в какой-то момент нужен полный контроль, и очень высоко ценятся разработчики, которые умеют этот контроль получить и использовать. И мне все хочется найти, но пока никак не получается, реализацию идею из книги Дейта об интеграции языка программирования и языка запросов к базе данных. И того, что я видел ближе всего к этому подобрался LINQ, на Java я ничего подобного не встречал и в текущих проектах пишу сугубо императивный код, всеми силами избегая декларативщины.