我正在尝试检测和优化 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 行,而实际上结果集有 1,000,000 行!
所有列的存在使情况变得更糟。如果您想像每个表有 5 列,您可能会想像您得到了大约 5555 个“项目”,而结果集中的单元格数(行 * 列)实际上是 20,000,000。
显然,应用程序开发人员有责任意识到这个问题并且不以这种方式编写查询。然而,这有时会无意中发生(并且以不太严重的方式),如果能够检测应用程序以某种方式识别这些情况,那就太好了。
但是,我一直无法找到任何方法来计算(从 Java/Hibernate 应用程序中)原始结果集中的行数或列数。Hibernate 拦截器、Hibernate 事件和 Hibernate 统计信息似乎都无法访问此信息。
有什么建议么?提前致谢。