我想从第5000000条记录(id = 5000000)中选择余额低于100的25行,然后在oracle db中执行以下操作:
select a.acc_id, a.first_name, a.last_name, b.balance from account a join balance b on a.acc_id = b.acc_id where a.acc_id >= 5000000 and b.balance < 100 order by a.acc_id asc fetch first 25 rows only;
上面的查询运行很快,没有问题。但是,当我尝试将其转换为querydsl代码时:
jpaQueryFactory
.select(a.accId, a.firstName, a.lastName, b.balance)
.from(qAccount)
.join(qBalance).on(qAccount.accId.eq(qBalance.accId))
.where(qAccount.accId.goe(5000000)
.and(qBalance.balance.lt(100)))
.orderBy(qAccount.accId.asc())
.limit(25)
.fetch();
生成的查询变成这样:
select * from ( select a.acc_id, a.first_name, a.last_name, b.balance from account a inner join balance b on ( a.acc_id = b.acc_id ) where a.acc_id >= 5000000 and ( b.balance < 100 ) order by a.acc_id asc ) where rownum <= 25;
查询也可以,但是非常慢。 (我认为)这是因为它获取ID为5000000后的所有记录并切出前25行。
是否有防止这种情况的方法,以便查询可以像我使用的第一个查询一样快速运行?