首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何利用Hibernate和PostgreSQL提高Spring上的选择查询速度?

如何利用Hibernate和PostgreSQL提高Spring上的选择查询速度?
EN

Stack Overflow用户
提问于 2018-09-05 21:02:14
回答 1查看 1.7K关注 0票数 0

我有一个Spring项目,我最近成功地在一个VPS上部署了这个项目。当在我的机器上几乎立即运行的select查询减速到爬行时,我感到非常惊讶。我知道这会慢一点,我只是没有期望那么多。

我创建了一个测试项目来复制这个问题。它从包含100 000行的表中选择大约20 000行。创建查询需要大约100个μs,运行查询需要0、5-2个s。我尝试用10×多行进行测试,但花费的时间比这长得多,并最终抛出了OutOfMemoryError

我四处寻找,似乎不应该花这么长时间,特别是因为在我看来,数据不多。我阅读并学习了有关索引的内容,但是即使是一个被认为是索引使用的好例子的查询也需要很长的时间。直接在psql控制台中运行查询需要大约100 ms没有索引,20 ms使用。

如果您想测试它,请下载服务器客户端项目,并按照说明进行操作。我从我真正的项目开始,尽可能地删除了很多东西,但是留下了相似的东西,这样就可以比较了。

我的VPS规格:

2×2,4 GHz CPU

2GB RAM

代码语言:javascript
复制
uname -a
Linux ampix 2.6.32-042stab127.2 #1 SMP Thu Jan 4 16:41:44 MSK 2018 x86_64 GNU/Linux

德比安·杰西

Java 8 x64

PostgreSQL 9.4

弹簧启动2.0.1

提前谢谢。

Update 1:忘记在Spring之外编写关于测试的内容,并且忘记在选择条件中使用0,8而不是0,9,所以所选行的数量比我最初编写的要多。

更新2:使用派生查询返回Stream<>可以提高性能可忽略不计。

EN

回答 1

Stack Overflow用户

发布于 2018-09-05 23:05:00

您可能会耗尽RAM,尤其是只有2GB的内存。我还没有在Postgres服务器上分析您的查询,但是我首先尝试两件事:

  1. 首先,修复您的查询(特别是这样简单的查询),以使用派生的Spring数据JPA查询,甚至Spring数据JPQL查询: 公共接口ScaleTestRepository扩展了CrudRepository,ScaleTestRepositoryCustom { //这是一个派生的查询列表findByWhereTest(BigDecimal whereTest);}/或do.公共接口ScaleTestRepository扩展了CrudRepository、ScaleTestRepositoryCustom { //这是一个派生查询@查询(“从scaleTest选择ScaleTest as scaleTest where_test > ?")列表findByWhereTest(BigDecimal whereTest);}

上面的内容将让Spring为您派生查询,然后您可以利用以下内容。

  1. 其次,使用StreamFlux作为返回类型: 流findByWhereTest(BigDecimal whereTest);/或do Flux findByWhereTest(BigDecimal whereTest); 其中任何一个都会流(通过零碎的ResultSet),这样您就不会把所有的数据都拖到内存中并耗尽内存。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52193346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档