防止 Ebean 中的 "order by" 子句

Prevent "order by" clause in Ebean

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

我使用 Play Framework 2.6、H2 1.4 数据库和 Ebean 11.15 (PlayEbean 4.1.3)。我有一个有 10 万行的 table,而且它越来越大。

我有几个计划任务,其中 select 来自 table 的一批记录和处理数据,顺序无关紧要。

例如我使用这个查询:

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;

如果没有order by 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();

目前唯一的解决办法是使用.orderBy("1")