【问题标题】:Grails criteria running too slowGrails 标准运行太慢
【发布时间】:2012-02-21 15:24:31
【问题描述】:

以下标准运行缓慢,令人无法接受。在不详细介绍表的主键或索引的情况下,您是否发现任何可以加快运行速度的特别之处?

def results = OpportunityApplication.createCriteria().list() {

            isNull('dateDeleted')

            or {
                opportunityInst {
                    isNull('dateDeleted')
                    opportunity {
                        isNull('dateDeleted')
                        gt('advertisingEndDate', new Date())
                        eq('useOrgAsContact', false)
                    }
                    opportunityLocation {
                        isNull('dateDeleted')
                        eq("email", user.email)
                    }
                }

                if (isPartner)
                {
                    opportunityInst {
                        isNull('dateDeleted')
                        opportunity {
                            isNull('dateDeleted')
                            gt('advertisingEndDate', new Date())
                            eq('useOrgAsContact', true)
                            organisation {
                                isNull('dateDeleted')
                                eq("email", user.email)
                            }
                        }
                    }
                }
            }

        }

【问题讨论】:

  • 在不了解您的数据库或需求的情况下,我只能建议您从数据库中删除大量数据或从查询中删除大量谓词
  • @Don 这几乎没有建设性,但我完全同意他需要发布数据库架构。
  • 如果开启 SQL 日志记录,则可以获取生成的查询并在其上运行EXPLAIN。这比仅仅猜测要好。

标签: grails grails-orm criteria


【解决方案1】:

对我的标准的优化非常简单。我所要做的就是将重复的位移动到共享的 sn-p 中,如下所示

opportunityInst {
                isNull('dateDeleted')
                opportunity {
                    isNull('dateDeleted')
                    gt('advertisingEndDate', new Date())
                }
                or {
                    if (isPartner)
                    {
                        opportunity {
                            eq('useOrgAsContact', true)
                            organisation {
                                isNull('dateDeleted')
                                eq("email", user.email)
                            }
                        }
                    }
                    and {
                        opportunity {
                            eq('useOrgAsContact', false)
                        }
                        opportunityLocation {
                            isNull('dateDeleted')
                            eq("email", user.email)
                        }
                    }
                }
            }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-04
    • 2017-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    • 2017-01-28
    相关资源
    最近更新 更多