我正在尝试获取在OtherTable中至少出现一次的用户列表。以下是使用Grails的非常低效的HQL查询。通常,在查询中最多只能运行几百个用户,但在OtherTable中可能会有一百万个用户引用。
List<User> users = User.executeQuery("select user " +
"from User as user where user.id = any(" +
"select otherTable.user.id from OtherTable as otherTable)")
如何提高此查询的效率?
答案 0 :(得分:2)
这个SQL可能更有效,
select distinct u.id from user as u
inner join other_table ot
on u.id = ot.id
这是一个HQL,
select distinct user
from User as user
inner join user.otherTable as ot
使用Criteria API
User.createCriteria().listDistinct {
createAlias("otherTable","ot")
eq('id','ot.id')
}
以上两点都需要正确映射您的域类。如果您没有OtherTable
映射到User
。试试这个,
select distinct user from User user, OtherTable ot
where user.id = ot.user_id
你可能已经注意到我们完全避免在这里进行全表扫描;它是一个单一的查询 - 与您发布的查询不同,后者使用子查询。使用id
加入两个实体/表应该更有效 - 假设id
列被编入索引。
答案 1 :(得分:0)
尝试以下查询:
List<User> users = User.executeQuery("select user " +
"from User as user where" +
"user.id in (select distinct otherTable.user.id from OtherTable as otherTable)")
希望它会有所帮助!