java - 防止 Ebean 中的 "order by"子句

标签 java playframework ebean

Ebean ORM 向每个查询添加 sort by t0.id 子句,这会导致性能非常糟糕。

我使用 Play Framework 2.6、H2 1.4 数据库和 Ebean 11.15 (PlayEbean 4.1.3)。我有一个包含 100k 行的表,并且它会变得越来越大。

我有几个计划任务,它们从表中选择一批记录并处理数据,顺序并不重要。

例如我使用这个查询:

Chunk.find.query()
        .select("id, lat, lon, data, status")
        .fetch("area", "id, polygon")
        .setMaxRows(100)
        .where()
            .eq("status", 0)
        .query()
        .findList();

然后 Eben 生成并执行:

select 
  c.id,
  c.lat,
  c.lon,
  c.data,
  c.status,
  a.id,
  a.polygon
from chunk c
join area a on a.id = c.area_id 
where c.status = 0
order by c.id
limit 100;

如果没有按 c.id 排序,那就太好了。

如果我手动执行查询,大约需要 5000 毫秒。但如果我删除 order by 子句,只需要大约 10 毫秒!我的应用程序中有很多地方不需要排序,而且它可以运行得更快。

最佳答案

您可以将 .orderById(false) 与您正在使用的 Ebean 版本一起使用。这是在 11.12.1 中添加的

Chunk.find.query()
    .select("id, lat, lon, data, status")
    .fetch("area", "id, polygon")
    .setMaxRows(100)
    .where()
        .eq("status", 0)
    .query()
    .orderById(false)
    .findList();

关于java - 防止 Ebean 中的 "order by"子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54376057/

相关文章:

scala - 今天的选项可让您更轻松地迁移到 Play 2

java - 使用 war 时组到 IBM Liberty (WLP) 中的角色映射

java - 如何将基类对象分配给父类引用?

java - 重新加载时发生 ClassCastException

scala - HBase - Scala - 无法初始化类 ProtobufUtil

Java Play Ebean - 如何使用表达式 Expr.Or() 或类似的

java - ebean .save() 不返回标识列值

java - 为什么当有很多请求时应用程序会挂起?

java - 向 Dropwizard 添加额外的指标

java - 如何使用 Docker 在 Jelastic 上部署 Play 2.5 应用程序?