【问题标题】:Slow queries for large tables using H2 database使用 H2 数据库对大表的慢查询
【发布时间】:2016-01-06 14:56:37
【问题描述】:

我有一个使用 Ebean 和 H2 的 Play 应用程序(2.3.4 java)。

我有一张大表(500000 行),当我提出这个查询时,我在大约 20 秒后得到结果(2014 年的笔记本电脑不错)

return new Finder<>(Long.class, Event.class).where()
            .where().eq("author.id", getId())
            .orderBy("id desc")
            .findPagingList(20)
            .setFetchAhead(false)
            .getPage(page);

这基本上意味着我想要表格的最后 20 行。如何提高性能?

【问题讨论】:

  • 随便拍:如果你的模型包含很多关系可能会浪费时间去获取它们,尝试使用select("...")fetch("...")来限制获取的资源,同时为Ebean打开语句登录看看什么正是它在查询数据库期间所做的
  • @biesior 我尝试了选择和获取,但没有帮助。但只有当我删除行 '.orderBy("id desc")' 时,每件事都会很快!即使 '.orderBy("id asc")' 没有改变性能,......那么如何才能获得最新的 X 条目,并具有良好的性能?谢谢
  • @biesior 我提到的这些性能处于调试模式(不是生产)。你认为我会看到生产模式有很大的改进吗?
  • 我不认为开发环境会减慢查询速度...通过 H2 控制台登录到您的数据库并在那里尝试此查询,同时检查字段是否被正确索引

标签: sql playframework playframework-2.0 h2 ebean


【解决方案1】:

首先请注意,findPagingList() 已从 Ebean 的 API 中删除,因为人们注意到人们使用它不正确......所以您只能在旧 Ebean 版本上使用 findPagingList()。

通常,如果您要返回/迭代很多行,请确保您使用 findEach()/findEachWhile() ... 在旧 Ebean 中您会看到 findIterate(),它的作用基本相同。

如果此查询在大约 20 秒内真正返回 20 行,那么您应该获取查询解释计划并编辑您的问题,包括执行的完整 SQL 和 SQL 解释计划。

如果您的查询返回许多行...那么您很可能不应该使用 findPagingList() 而是使用 findIterate() ...或者更好的是更新到最新的 Ebean 并使用 findEach() - 特别是如果您使用的是 Java 8。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-21
    • 2014-03-25
    • 2021-05-07
    • 1970-01-01
    • 2014-10-15
    • 2021-12-30
    相关资源
    最近更新 更多