JPQL性能与本机查询

时间:2017-04-04 09:30:57

标签: java postgresql jpa eclipselink

考虑以下结构

@Entity
@NamedQuery(name="find",query="select a from A a where a.parent.id=:id")
public class A {
@Id
int id;
String name;
@OneToMany
@JoinColumn
List<A> childs;
@ManyToOne(fetch=fetchType.lazy)
A parent;
}

postgre引擎中的表A包含大约700000条记录

执行此命名的jpql查询平均需要2.2秒 在将其翻译为本机后执行相同的查询时平均需要0.3秒

"select id,name, parent_id from A where parent_id=?"

它尝试了eclipse链接分析器,查询大部分时间的属性是&#34;执行语句&#34; 大约1.9秒,而在缓存上丢失0.3秒,登录,交易管理等...

如何查找查询在jpql中消耗更多时间的原因。我是否在配置中遗漏了一些东西,或者当数据库中存在大量数据时,jpql对这种简单查询的开销为1.9秒是很自然的

修改

请注意,当我使用以下命名查询(提及字段/列)时,性能没有提高。

query="select a.name,a.id from A a where a.parent.id=:id"

1 个答案:

答案 0 :(得分:0)

我可以看到两种方法之间的区别是: 1- JPQL = 从A a中选择a,其中a.parent.id =:id 将对数据库执行SQL联接以获取数据,您将在幕后看到以下内容:

select * from A a
        JOIN parent on parent.id = a.parent_id
        WHERE a.parent_id = ?

2-本地SQL = 从A那里选择id,名称,parent_id,其中parent_id =?,将不执行任何连接,并且将获取唯一表上的数据,这从性能角度来看是更直接的

我鼓励面临相同问题的人们启用show_sql属性,以便首先比较生成的SQL查询。延迟可能是由其他因素引起的:表格上的锁等。