首页 > 解决方案 > 使用 postgres 索引选择从偏移到限制的所有记录

问题描述

我想从大约 40 列和 1.000.000 行的表中获取从偏移到限制的所有数据。我试图通过 postgres 索引 id 列,并通过 java 和 entitymanager 获取我的选择查询的结果。

我的查询需要大约 1 分钟才能得到结果,这有点太长了。我尝试使用不同的索引,并将查询限制为 100,但这次仍然需要。我该如何解决?我需要更好的索引还是我的代码有什么问题?

CriteriaQuery<T> q = entityManager.getCriteriaBuilder().createQuery(Entity.class);
TypedQuery<T> query = entityManager.createQuery(q);
List<T> entities = query.setFirstResult(offset).setMaxResults(limit).getResultList();

标签: javapostgresqljpaentitymanager

解决方案


现在你可能根本不使用索引。休眠限制/偏移如何转换为数据库操作存在一些歧义(在 postgres 的情况下请参阅此评论)。如对此帖子的回复中详细描述的那样,这可能意味着开销。

如果您与 id 列的值有直接的偏移量和限制关系,则可以在表单的查询中使用它

SELECT e
FROM Entity
WHERE id >= offset and id < offset + limit

鉴于请求的记录数明显小于数据库将使用索引的表中的记录总数。

接下来是,40 列是相当多的。如果您实际上需要的数量要少得多,则可以定义一个仅包含所需属性的受限实体并查询该实体。这应该会减少一些开销。

如果您仍然没有达到性能要求,您可以选择采用 jdbc 连接/查询而不是使用休眠。

顺便提一句。您可以记录 jpa/hibernate 发出的实际 sql 并使用它从 postgress 获取执行计划,这将向您显示查询的实际外观以及是否会使用索引。此外,您可以监控数据库的查询执行时间,以了解它消耗的处理时间的哪一部分以及您的 java 客户端消耗的处理时间加上数据传输开销。


推荐阅读