Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 使用连接提高Grails CreateCriteria查询速度_Mysql_Sql_Performance_Hibernate_Grails - Fatal编程技术网

Mysql 使用连接提高Grails CreateCriteria查询速度

Mysql 使用连接提高Grails CreateCriteria查询速度,mysql,sql,performance,hibernate,grails,Mysql,Sql,Performance,Hibernate,Grails,我有一个Grails应用程序,它从许多表中执行相当大的createCriteria查询。我注意到性能非常糟糕,并将其精确定位到我后来所做的对象操作,而不是createCriteria本身。我的查询成功地获得了我想要的所有原始对象,但在我操作对象时,它正在为每个元素执行新的查询。以下是我的控制器代码的简化版本: def hosts = Host.createCriteria().list(max: maxRows, offset: rowOffset) { // Lots of if st

我有一个Grails应用程序,它从许多表中执行相当大的createCriteria查询。我注意到性能非常糟糕,并将其精确定位到我后来所做的对象操作,而不是createCriteria本身。我的查询成功地获得了我想要的所有原始对象,但在我操作对象时,它正在为每个元素执行新的查询。以下是我的控制器代码的简化版本:

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分钟,这太长了。任何建议都很好!谢谢

使用标准的一个好处是,您可以轻松地急切地获取关联
。因此,在引用关联时,您不会面临众所周知的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)
    }
}
如果您觉得裁剪一个标准很麻烦,那么您可以很好地回退到HQL,并使用
joinfetch
对关联进行即时索引


我希望这一定会将大约700条记录的周转时间减少到5秒以内。

我注意到这种方法不适用于可为空的字段。例如,如果“supporter”字段为空,则查询根本不会返回该行。有没有办法克服这个问题?是的。默认情况下,关联是使用
内部联接获取的,因此没有可为空的字段。您可以强制它使用左联接以获取可为空的字段。接下来,您将获得语法@尼斯拉克