Вопрос проверяет умение диагностировать проблемы ORM и принимать архитектурные решения при падении производительности.
Первым шагом нужно посмотреть фактический SQL и план выполнения. Часто проблема связана с lazy loading или N+1 запросами. Решение может включать переписывание запроса, использование fetch join или native SQL. Иногда лучше отказаться от ORM для конкретного запроса. Важно не лечить проблему вслепую.
ORM абстрагирует SQL, но иногда генерирует неэффективные JOIN-запросы, особенно в сложных моделях данных.
Неоптимальный JOIN в ORM — это SQL-запрос, который корректен логически, но приводит к избыточным соединениям, большому объёму данных или лишним запросам.
Перед тем как менять код, важно понять, что именно происходит.
Включить логирование SQL
Проверить количество запросов
Найти лишние JOIN или N+1
Используются ли индексы
Есть ли полные сканирования таблиц
Где именно узкое место
Lazy loading
вызывает каскадные запросы
приводит к N+1 проблеме
Сложные графы сущностей
ORM тянет лишние связи
данные, которые не нужны бизнес-логике
Использовать fetch join в JPQL
Писать явные JPQL-запросы вместо автогенерации
Применять EntityGraph
Использовать native SQL для сложных кейсов
Разделять read-модели и write-модели
ORM — не серебряная пуля
Для отчётов и аналитики лучше прямой SQL
Гибридный подход — нормальная практика
Если ORM генерирует неоптимальные JOIN-запросы, нужно анализировать SQL и план выполнения, а затем осознанно выбирать между настройкой ORM, явными запросами или отказом от ORM в конкретном месте.