代码之家  ›  专栏  ›  技术社区  ›  GuiRitter

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

  •  0
  • GuiRitter  · 技术社区  · 6 年前

    我有一个springboot项目,我最近设法在VPS上部署了它。当在我的机器上运行的select查询几乎立刻就慢到爬行的速度时,我感到非常惊讶。我知道会慢一点,只是没料到会有那么多。

    我创建了一个测试项目来重现这个问题。它从一个包含100000行的表中选择大约20000行。创建查询大约需要100秒,运行查询需要0,52秒。我试着多测试10行,但花了比这长得多的时间,最终抛出 OutOfMemoryError .

    psql 控制台在没有索引的情况下大约需要100毫秒,在没有索引的情况下需要20毫秒。

    server 以及 client 项目并遵循那里的说明。我从我真正的项目开始,尽可能多地删除了一些东西,但把它放在相似的地方,这样就可以比较了。


    22.4 GHz CPU

    2 GB内存

    uname -a
    Linux ampix 2.6.32-042stab127.2 #1 SMP Thu Jan 4 16:41:44 MSK 2018 x86_64 GNU/Linux
    

    德比安·杰西

    爪哇8 x64

    弹簧靴2.0.1.释放


    提前谢谢。

    更新1 :忘记在Spring之外编写test,忘记在select条件中使用0,8而不是0,9,因此所选行的数目大于最初编写的行数。

    更新2 :使用派生查询返回 Stream<>

    1 回复  |  直到 6 年前
        1
  •  0
  •   Dovmo    6 年前

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

    1. 首先,修复您的查询(特别是对于像这样的简单查询)以使用派生的Spring数据JPA查询,甚至Spring数据JPQL查询:

      public interface ScaleTestRepository extends CrudRepository<ScaleTest, Integer>, ScaleTestRepositoryCustom {
      
          // This is a derived query
          List<ScaleTest> findByWhereTest(BigDecimal whereTest);
      
      }
      
      // Or do...
      
      public interface ScaleTestRepository extends CrudRepository<ScaleTest, Integer>, ScaleTestRepositoryCustom {
      
          // This is a derived query
          @Query("select scaleTest from ScaleTest as scaleTest where where_test > ?")
          List<ScaleTest> findByWhereTest(BigDecimal whereTest);
      
      }
      

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

    1. 第二,使用 Stream Flux

      Stream<ScaleTest> findByWhereTest(BigDecimal whereTest);
      
      // Or do
      
      Flux<ScaleTest> findByWhereTest(BigDecimal whereTest);
      

      它们中的任何一个都将流式传输(通过 ResultSet