Я пытаюсь обнаружить и оптимизировать неэффективные объединения в приложении Java/Hibernate. Я заметил, что в некоторых случаях из-за характера взаимодействия узлов в наборах результатов поток данных, передаваемых по проводу, очень неэффективен.
Позвольте мне привести пример. Предположим, у вас есть запрос HQL, который выглядит так:
select s from Store s
left join fetch s.items i
left join fetch s.employees e
left join fetch s.customers c
where s.id = :id
(Игнорируйте на мгновение, что это не интеллектуальный запрос - это просто упрощенный пример).
Если вы представляете, что в данном магазине есть 1000 товаров и 10 сотрудников и 100 клиентов, вы вернете дерево объектов Java с 1111 объектами. Это может усугубить вас мыслью, что из базы данных было возвращено приблизительно 1111 строк, тогда как на самом деле в наборе результатов было 1000 000 строк!
Наличие всех столбцов делает это хуже. Если вы представляете, что каждая таблица имеет 5 столбцов, вы можете себе представить, что вы получили примерно 5555 "элементов" назад, тогда как количество ячеек (столбец строк *) в наборе результатов было фактически 20 000 000.
Очевидно, что ответственность разработчиков приложений должна быть осведомлена об этой проблеме и не писать запросы таким образом. Однако это иногда случается непреднамеренно (и менее строгими способами), и было бы здорово иметь возможность заставить приложение как-то идентифицировать эти ситуации.
Однако мне не удалось найти способ вычислить (из приложения Java/Hibernate) либо количество строк, либо количество столбцов в исходном наборе результатов. Кажется, что ни перехватчики Hibernate, ни Hibernate, ни статистика Hibernate не дают доступа к этой информации.
Любые предложения? Спасибо заранее.