2017-08-25 1372 views
1

我有一个包含大约500万条记录和相当复杂的查询的(oracle)表,它使用像蟾蜍这样的数据库工具在不到5秒的时间内返回约5000条记录。 但是,当我通过entityManager(eclipseLink)运行查询时,查询运行了几分钟...JPA getResultList比SQL查询慢得多

我在执行过程中可能太天真了。 我这样做:

Query query = em.createNativeQuery(complexQueryString,Myspecific.class); ... setParameter ... List result = query.getResultList();

complexQueryString以“SELECT *”开头。

我有什么样的优化? 可能只有一个选择我以后真正需要的字段。一些解释会很好。

+0

如果没有深入的数据库知识,JPA中的本机查询的意义有限。没有Myspecific类和查询 –

回答

0

我有一个类似的问题(我试图在不到一秒钟的时间内读取8万列的800000条记录),最好的解决方案是回退到jdbc。 ResultSet的创建和读取速度比使用JPA快10倍,即使在执行本机查询时也是如此。

如何使用jdbc:通常在J2EE-Servers中,JDBC-DataSource可以注入为@Resource。

解释:我认为OR-Mappers尝试创建和缓存对象,以便稍后可以轻松检测到更改。这是一项非常大的开销,如果您只是与单个实体合作,则无法识别。

+0

的情况下,详细的anser是不可能的,特别是在这部分中:如果开发人员感觉控制在低级别,则使用JDBC;如果期望更高的逻辑级别,则使用JPA。对我来说,最糟糕的是在本机查询中混合使用JPA +扩展编码。有 –

+0

顺便说一句,在SQL服务器端正确计算/过滤,具有良好设计的数据库(索引等),不会在客户端创建太多的Java对象 –

+0

@JacekCz我同意,但有时查询也得到复杂。我的用例是一个相当复杂的工作选择算法,已经使用CTE。 – aschoerk

0

Query.setFetchSize(...)可能会有所帮助。它告诉jdbc驱动程序在一个块中返回多少行。只需在getResultList()之前调用它;

query.setFetchSize(5000); 
query.getResultList();