我正在尝试检测并优化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个顾客,你会得到一个包含1111个实体的Java对象树。这可能让你误以为从数据库中返回了大约1111行,而事实上结果集有1000000行!
所有列的存在使得情况更糟。如果你想象每个表有5列,你可能会想象你返回了大约5555个“项”,而实际上结果集中单元格的数量(行*列)实际上是20000000。
显然,应用程序开发人员有责任意识到这个问题并不要编写这样的查询。然而,这有时是无意的(并且程度较轻),如果能够通过某种方式对应用程序进行仪器化以识别这些情况,那将是很棒的。
然而,我一直无法找到任何一种方法来计算(从Java/Hibernate应用程序内部)原始结果集中行数或列数。Hibernate拦截器、Hibernate事件和Hibernate统计信息都似乎无法访问此信息。
有任何建议吗?先谢谢了。