这让我疯狂。与直接通过 Navicat 运行该查询相比,使 hibernate 简单选择非常慢。还有什么更有趣的。使用本地数据库运行此查询非常快,但远程使用它真的很差。
我正在执行 Hibernate 本机 SQL 查询(因为 HQL 或 Criteria 不支持左连接):
List list = new ArrayList();
String queryStr = "select s.* from sales_unit s left join sales_unit_relation r on (s.sales_unit_id = r.sales_unit_child_id) where r.sales_unit_child_id is null";
Query query = session.createSQLQuery( queryStr ).addEntity( SalesUnit.class );
Long start = System.currentTimeMillis();
list.addAll( query.list() );
Long stop = System.currentTimeMillis();
System.out.println( "Time: " + (stop - start) + "ms." );
实体的结构并不重要。SALES_UNIT 和 SALES_UNIT_RELATION 表都有大约 28k 条记录
使用本地数据库在我的本地 JBoss上运行的结果约为 30-120 毫秒。在远程数据库上运行时,本地 JBoss(相同数据)导致时间在 30000-40000 毫秒之间。当我使用 Navicat 运行这个查询时,本地和远程调用都非常快(20-30 毫秒)。
本地和远程数据库的安装方式相同 -> Oracle Enterprise Edition 11.2.0.1.0。
性能如此差的问题可能是什么?我该如何调试它?
阅读本文:简单的休眠查询返回速度很慢,但设置构造函数并没有改变任何东西
编辑。
SALES_UNIT表包含一些关于销售单元节点的基本信息,例如名称等。唯一的关联是与表 SALES_UNIT_TYPE,如 ManyToOne。主键是 ID,字段 VALID_FROM_DTTM 是日期。
SALES_UNIT_RELATION包含销售单元节点之间的关系 PARENT-CHILD。由 SALES_UNIT_PARENT_ID、SALES_UNIT_CHILD_ID 和 VALID_TO_DTTM/VALID_FROM_DTTM 组成。与任何表没有关联。这里的PK是..PARENT_ID、..CHILD_ID和VALID_FROM_DTTM