首页 > 解决方案 > 防止 Ebean 中的“order by”子句

问题描述

Ebean ORMsort 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;

没有order by c.id.

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

标签: javaplayframeworkebean

解决方案


您可以将 .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();

推荐阅读