我有一个(oracle)表,其中包含大约500万条记录和一个非常复杂的查询,使用像toad这样的数据库工具,在不到5秒的时间内返回大约5000条记录。 但是,当我通过entityManager(eclipseLink)运行查询时,查询运行了几分钟......
我在实施中可能太天真了。 我这样做:
查询query = em.createNativeQuery(complexQueryString,Myspecific.class); ... setParameter ... List result = query.getResultList();
complexQueryString以“SELECT *”开头。
我有哪些优化? 可能只有一个是选择我以后真正需要的字段。一些解释会很棒。
答案 0 :(得分:0)
我遇到了类似的问题(我尝试在不到一秒的时间内读取800列8列的记录),最好的解决办法就是回到jdbc。即使在进行本机查询时,ResultSet的创建和读取速度也比使用JPA快10倍。
如何使用jdbc:通常在J2EE-Servers中,JDBC-DataSource可以作为@Resource注入。
解释:我认为OR-Mappers尝试创建和缓存对象,以便以后可以轻松检测到更改。这是一个非常大的开销,如果您只是使用单个实体,则无法识别。
答案 1 :(得分:0)
Query.setFetchSize(...)可能会有所帮助。它告诉jdbc驱动程序在一个块中返回多少行。只需在getResultList();
之前调用它query.setFetchSize(5000);
query.getResultList();