玩2.2非常大的数据库分页

时间:2014-03-05 14:49:17

标签: java sql postgresql playframework ebean

我正在编写一个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中实现游标的建议?

1 个答案:

答案 0 :(得分:0)

这听起来像是一个JDBC问题,因为你的查询在postgres上运行得很快,并且你为这两个使用相同的数据库。

建议:

尝试检查你是否正在使用OFFSET和LIMIT来获取你想要的数据,你的驱动程序可能正在将整个数据集加载到内存中,然后选择你想要的数据。

如果是这种情况,请使用cursor代替,这有助于仅将数据的小块可食用块加载到内存中。