kam*_*mil 8 sql oracle performance hibernate
这让我疯狂.与直接通过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." );
Run Code Online (Sandbox Code Playgroud)
实体的结构并不重要.SALES_UNIT和SALES_UNIT_RELATION表的记录大约为28k
结果在我当地的JBoss上用本地数据库运行,大约30-120ms.在远程数据库运行时,本地JBoss(相同的数据)导致时间在30000-40000ms之间.当我使用Navicat运行此查询时,本地和远程调用都非常快(20-30ms).
本地和远程数据库都以相同的方式安装 - > Oracle Enterprise Edition 11.2.0.1.0.
可能是这种糟糕表现的问题?我该怎么调试呢?
阅读:简单的hibernate查询返回非常缓慢,但设置构造函数没有改变任何东西
编辑.
SALES_UNIT表包含一些基本信息abot sales unit节点,例如name等.唯一的关联是表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
谢谢大家的帮助。经过很长时间的努力解决这个问题,最后 kaliatech 的答案帮助我调试了这个问题。
首先,我的问题犯了一个严重的错误。我写道:
使用本地数据库运行此查询确实很快,但远程使用它真的很差。
因为这并不完全正确。我在 Hibernate 中执行的查询如下所示:
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
Run Code Online (Sandbox Code Playgroud)
但我使用 SQL PLus 或 Navicat 执行的实际查询是:
select * 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
Run Code Online (Sandbox Code Playgroud)
请注意,第一个查询 select 开始:select s.* ...而第二个查询开始是select * ...。这就是表现如此糟糕的原因。现在两个查询都立即完成了。问题是,有什么区别:性能问题:select s.* vs select * 之间的差异