一尘不染

与直接运行相比,Hibernate选择性能较差-如何调试?

sql

这让我疯狂。与直接通过Navicat运行该查询相比,使休眠简单选择非常慢。更有趣的是。使用本地数据库运行此查询确实非常快,但是远程使用它确实很差。

我正在做以下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-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


阅读 133

收藏
2021-03-10

共1个答案

一尘不染

谢谢大家的帮助。经过长时间的努力,最后,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
之间的区别

2021-03-10