我正在编写一个Play 2.2.1应用程序来显示非常大的postgres表的内容(至少 O (10 ^ 8))。为此,我修改了computer database sample database。
我的页面方法几乎直接取自示例中的计算机类:
public static Page<Lemma> page(int page, int pageSize, String sortBy, String order, String filter) {
if(filter.isEmpty()) {
return
find.where()
.findPagingList(pageSize)
.setFetchAhead(true)
.getPage(page);
} else {
return
find.where()
.ilike("name", "%" + filter + "%")
.orderBy(sortBy + " " + order)
.findPagingList(pageSize)
.setFetchAhead(true)
.getPage(page);
}
}
如果过滤器为空,则出于性能问题,我避免任何排序。我的玩具数据库有20,000,000个条目它运行良好,但有一个更实际的200,000,000个文档示例我总是有时间连接。
“name”列已编制索引,并且直接查询数据库的速度非常快。我总是使用JVM的“-Xmx4096m”选项运行。
我缺少什么?我做错了什么?有什么建议吗?
更新
瓶颈似乎是查询SELECT COUNT(*) FROM lemma t0 ...
,它被发送以显示找到的文档数量。有什么想法提高性能?有没有像Peter建议的那样在ebean中实现游标的建议?
答案 0 :(得分:0)
这听起来像是一个JDBC问题,因为你的查询在postgres上运行得很快,并且你为这两个使用相同的数据库。
建议:
尝试检查你是否正在使用OFFSET和LIMIT来获取你想要的数据,你的驱动程序可能正在将整个数据集加载到内存中,然后选择你想要的数据。
如果是这种情况,请使用cursor代替,这有助于仅将数据的小块可食用块加载到内存中。