【发布时间】:2021-08-13 19:40:32
【问题描述】:
我有一个 springboot 应用程序和一个附加的 postgresql 数据库。我有一张有 40 条 mio 记录的表。该表非常简单:ID、名称(varchar)、x(数字)、y(数字)。
我必须像这样查询这个表:select * from table where x minX and y minY
我已经在 X 和 Y 上创建了索引。
如果我从桌面客户端(例如 DBeaver)查询数据库,获取数据大约需要 700 毫秒,这对于我的需要来说是完全可以接受的。
但是,如果我从我的 springboot 应用程序(通过 REST 端点)查询,则需要 1 分钟(!),这太慢了。
我可以很容易地理解,通过我的 springboot 应用程序会比通过数据库客户端慢(因为数据库和应用程序之间的延迟、ORM、转换为 JAVA 等...)但超过 70 倍慢一点很奇怪,不是吗?
我想大大减少处理时间,你知道怎么做吗?
我的 jpa 仓库的方法是这样的:
@Query(value = "select * from table a where a.x < :maxX and a.x > :minX and a.y < :maxY and a.y > :minY", nativeQuery = true)
List<MyEntity> getMyEntityByXY(@Param("maxX") Double maxX, @Param("minX") Double minX, @Param("maxY") Double maxY, @Param("minY") Double minY);
我尝试使用“标准”jpa 查询和本机查询,因为它最接近通过 DB 客户端花费 700 毫秒的查询。
我有使用并行查询的想法,但它听起来不是一个合适的解决方案,而且我没有设法使用 postgresql 来做到这一点(例如,我知道 /* parallel(32) */ 使用 Oracle 的方式,但我可以用 postgres 做不到)。
谢谢
【问题讨论】:
-
除非您提供更多信息,否则无法判断,例如您的实体映射的外观。如果我不得不猜测,我会说要么不需要的东西被急切地取出,要么需要的东西被懒惰地取出。如果你不想更好地理解为什么hibernate查询这么慢,你也可以在application.properties中设置'spring.jpa.show-sql'标志为true,这样每个执行的sql语句都会被记录。
标签: java postgresql spring-boot jpa