我有一个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
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<>可以提高性能可忽略不计。
发布于 2018-09-05 23:05:00
您可能会耗尽RAM,尤其是只有2GB的内存。我还没有在Postgres服务器上分析您的查询,但是我首先尝试两件事:
上面的内容将让Spring为您派生查询,然后您可以利用以下内容。
Stream或Flux作为返回类型:
流findByWhereTest(BigDecimal whereTest);/或do Flux findByWhereTest(BigDecimal whereTest);
其中任何一个都会流(通过零碎的ResultSet),这样您就不会把所有的数据都拖到内存中并耗尽内存。https://stackoverflow.com/questions/52193346
复制相似问题