防止Ebean中的“ order by”子句

时间:2019-01-26 05:59:48

标签: java playframework ebean

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

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

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

例如,我使用以下查询:

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毫秒!而且在我的应用程序中有很多地方不需要排序,因此可以更快地工作。

2 个答案:

答案 0 :(得分:0)

您可以在所使用的Ebean版本中使用.orderById(false)。这是在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();

答案 1 :(得分:0)

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