在JPA中获取表格大小是一项昂贵的操作吗?

时间:2017-04-28 14:54:56

标签: mysql sql jpa jpa-2.0

我在Web应用程序中实现表查看的服务器端分页。这意味着用户具有激活第一页,最后一页,下一页和前一页的按钮。每次单击都会产生一个服务器请求,其中只返回要显示的记录。

要实现“最后一页”功能和滚动条,我需要客户端具有表的大小。我可以使用以下方法在服务器端获取此信息:

public long getCount(Class entityClass) {
    CriteriaBuilder builder = em.getCriteriaBuilder();
    CriteriaQuery<Long> query = builder.createQuery(Long.class);
    Root root = query.from(entityClass);
    Expression<Long> count = builder.count(root);
    query.select(count);
    TypedQuery<Long> typedQuery = em.createQuery(query);
    return typedQuery.getSingleResult();
}

此表可能非常活跃,有数百万条记录。运行此函数是否会导致SQL服务器中的大量CPU周期被使用?

关注的是这个应用程序的扩展程度。

1 个答案:

答案 0 :(得分:1)

这完全取决于数据库,我所知道的所有JPA实现都会将计数转换为select count(*) from Table。我们有一个带有130GB数据的单表的Postgresql,大多数行只有几千字节。做select (*) from table需要几分钟;开发人员曾经做过一个简单的未索引的选择查询,全表扫描大约需要45分钟。

在进行分页时,通常会有一个过滤器,将相同的文件管理器应用于数据查询和计数查询非常重要(使用CriteriaBuilder的主要原因之一是共享过滤部分查询)。今天我建议使用Spring-data,因为它几乎毫不费力地进行分页。

如果你有很多数据,你可以像谷歌一样,说'zip'有1.340.000.000的结果,但只允许你提前10页,如果你运行到最后你会看到他们实际上只加载了1000页。换句话说,它们会缓存估计大小,但要求您缩小搜索范围以获得更精确的结果。