当前位置: 首页 > 面试题库 >

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

燕嘉熙
2023-03-14
问题内容

这让我疯狂。与直接通过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


问题答案:

谢谢大家的帮助。经过长时间的努力,最后,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_relathtml" target="_blank">ion 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

之间的区别



 类似资料:
  • 更新:为了更明显地说明我正在努力做的事情:我将拥有5000万以上的设备流媒体音频。流平均为100KB,峰值流量时为200K流/分钟。我正在寻找一种存储解决方案来满足这种需求。我一直在研究Bookkeeper、Kafka、Ignite、Cassandra和Redis。到目前为止,我只对redis和ignite进行了基准测试,但我很惊讶ignite这么慢。

  • 2.2 选择与比较 vim 在执行脚本时,一般是按顺序逐条语句执行的。但如果只能像流水帐地顺序执行,未 免太无趣了,功能也弱爆了。本节介绍顺序结构之外的最普遍的选择分支结构,它可以根 据某种条件有选择地执行或不执行语句块(一条或多条语句)。 在 VimL 中通过 :if 命令来表示条件选择,其基本语法结构是: : if {expr} : " todo : endif 如果满足表达式 {e

  • 我在读关于CRCs,我偶然发现了CRC目录和这篇关于CRC-CCITT的文章。 我基于第二个链接实现了(参见下面的代码)。 我是不是遗漏了异或运算的一些属性?在我看来,这两个算法应该有相同的输出(当然不考虑第一个算法的增强),但它们没有。 PS:可执行代码:http://ideone.com/mkuqqq

  • JavaScript 有两种方式判断两个值是否相等。 等于操作符 等于操作符由两个等号组成:== JavaScript 是弱类型语言,这就意味着,等于操作符会为了比较两个值而进行强制类型转换。 "" == "0" // false 0 == "" // true 0 == "0"

  • 我有一个基于Java8 Spring Boot 2.3.3的应用程序(使用Hibernate5.4.20),我有一个Postgreql。我想最终了解使用数据库视图和@Sub选择是否更好(对于性能)。 简单概述一下:我有一个实体“Book”和3个实体“BookRank”(用户给书打1到10颗星)、“BookComment”(用户对书的评论)、“BookLike”(用户把书的评论放在一起),每个实体都

  • 我正在使KStream-KStream连接,其中创建2个内部主题。而KStream-KTable join将创建1个内部主题+1个表。 就性能和其他因素而言,哪个更好?