我有一个 Grails 应用程序,它执行从许多表中提取的相当大的 createCriteria 查询。我注意到性能非常糟糕,并将其精确定位到我之后执行的对象操作,而不是 createCriteria 本身。我的查询成功地获得了我想要的所有原始对象,但是当我操作这些对象时,它正在为每个元素执行新的查询。这是我的 Controller 代码的简化版本:
def hosts = Host.createCriteria().list(max: maxRows, offset: rowOffset) {
// Lots of if statements for filters, etc.
}
def results = hosts?.collect{ [ cell: [
it.hostname,
it.type,
it.status.toString(),
it.env.toString(),
it.supporter.person.toString()
...
]]}
我有更多的字段,包括调用执行自己的查询以查找相关对象的方法。所以我的问题是:如何将连接合并到原始查询中,这样我就不会为每一行执行大量额外的查询?目前查询 ~700 行需要 2 分钟,这太长了。任何建议都会很棒!谢谢!
最佳答案
使用条件的一个好处是您可以eagerly
轻松获取关联。因此,您在引用关联时不会遇到众所周知的 N+1 问题。
您没有在标准中提到逻辑,但我建议对于 ~700 行我肯定会选择这样的东西:
def hosts = Host.createCriteria().list(max: maxRows, offset: rowOffset) {
...
//associations are eagerly fetched if a DSL like below
//is used in Criteria query
supporter{
person{
}
}
someOtherAssoc{
//Involve logic if required
//eq('someOtherProperty', someOtherValue)
}
}
如果您觉得定制 Criteria 很麻烦,那么您可以很好地回退到 HQL 并使用 join fetch
为关联建立急切索引。
我希望这绝对可以将大约 700 条记录的周转时间减少到不到 5 秒。
关于mysql - 通过连接提高 Grails CreateCriteria 查询速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19781198/