java - 使用 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();
解决方案
现在你可能根本不使用索引。休眠限制/偏移如何转换为数据库操作存在一些歧义(在 postgres 的情况下请参阅此评论)。如对此帖子的回复中详细描述的那样,这可能意味着开销。
如果您与 id 列的值有直接的偏移量和限制关系,则可以在表单的查询中使用它
SELECT e
FROM Entity
WHERE id >= offset and id < offset + limit
鉴于请求的记录数明显小于数据库将使用索引的表中的记录总数。
接下来是,40 列是相当多的。如果您实际上需要的数量要少得多,则可以定义一个仅包含所需属性的受限实体并查询该实体。这应该会减少一些开销。
如果您仍然没有达到性能要求,您可以选择采用 jdbc 连接/查询而不是使用休眠。
顺便提一句。您可以记录 jpa/hibernate 发出的实际 sql 并使用它从 postgress 获取执行计划,这将向您显示查询的实际外观以及是否会使用索引。此外,您可以监控数据库的查询执行时间,以了解它消耗的处理时间的哪一部分以及您的 java 客户端消耗的处理时间加上数据传输开销。
推荐阅读
- android - 每次如何在 Dagger 2 中向我的提供范围对象发送数据
- ios - ios UIImage 超出 UIImageView 边框
- laravel - 将代码重构为与数据库无关
- sql - 使用 has_many 的关联命令:通过 Ruby on Rails 中的关联
- algorithm - 给定一组 n 个整数,列出所有可能的子集,其中 k1<= sum <=k2 , k1 和 k2 浮点数
- java - 将 Android API 从 27 降级到 21 (KOTLIN) 后出错
- ubuntu - CMUSphinx-go PortAudio 错误:设备不可用
- laravel - Laravel 5 使用 2 个数据库连接加入 2 个表
- python - 在python中随机化快速排序,递归问题
- android - google/android/gms/maps/model/LatLng 的 NoSuchMethodError