这让我疯狂。与直接通过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-120ms。在 远程 数据库上运行时,本地JBoss(相同的数据)导致时间在30000-40000ms之间。当我使用Navicat运行此查询时,本地和远程调用都非常快(20-30ms)。
本地和远程数据库都以相同的方式安装-> Oracle Enterprise Edition 11.2.0.1.0。
如此糟糕的表现可能是什么问题?我该如何调试?
阅读本文:简单的hibernate查询返回非常慢,但是设置构造函数并没有改变任何内容
编辑。
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
谢谢大家的帮助。经过长时间的努力,最后,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
但是,例如,我使用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
请注意,第一个查询选择开始:select s.* ...第二个查询是select * ...。这就是如此糟糕的表现的原因。现在,两个查询都将立即完成。问题是,有什么区别:性能问题:select s。与select之间的区别
select s.* ...
select * ...