gpt4 book ai didi

grails - 优化Grails查询

转载 作者:行者123 更新时间:2023-12-02 14:31:16 25 4
gpt4 key购买 nike

我正在尝试优化我的grails应用程序的速度。
我有这个:

Catalog a= Catalog.findByName('a');
Element b= Element.findByCatalogAndNumber(a,2);

这样我可以找到b。

但是我想我可以使用这样的东西:
Element b= Element.createCriteria().get{
catalog{
eq("name",'a')
}
eq("number",2)
}

但是我不确定是否会减少对数据库的查询,或者我只是在自欺欺人,创建更大的文件并通过这样做降低了我的应用程序的速度。

任何的想法?

最佳答案

我使用以下方法比较了您的查询的三个版本

  • Grails 2.4.4,Grails应用程序中的缓存默认设置
  • 在PostgreSQL 8.4中,已打开SQL语句日志记录以计算/查看SQL查询。


  • 第一个使用 的版本调用了Grails域类上的:
    def query1() {
    Catalog a = Catalog.findByName('a');
    log.info(a)

    Element b = Element.findByCatalogAndPos(a, 2);
    log.info(b)

    render(b.toString())
    }

    第二个使用 标准
    def query2() {
    Element b = Element.createCriteria().get {
    catalog {
    eq("name", "a")
    }
    eq("pos", 2)
    }

    render(b.toString())
    }

    最后一个使用 ,其中查询
    def query3() {
    def query = Element.where {
    catalog.name == "a" && pos == 2
    }

    Element b = query.get()

    render(b.toString())
    }

    第一个查询导致 两个 SQL查询,其他查询将仅向数据库发送一个查询 (使用从ElementCatalog的内部联接)。

    至于可读性/表达性,请选择第三个版本:它用一行文字表达您的意图,并且是最紧凑的版本。

    至于性能,请选择第二版或第三版。在高负载,许多并发用户/请求的情况下,查询的数量确实很重要。对于所有应用程序,这可能不是问题。

    顺便说一句,为了表现力,我总是选择第3版。如果查询条件随着时间的推移变得更加复杂,它将进行扩展。

    更新资料

    第一个版本使用的SQL语句:
    select this_.id as id1_1_0_, this_.version as version2_1_0_, this_.date_created as date_cre3_1_0_, this_.last_updated as last_upd4_1_0_, this_.name as name5_1_0_, this_.remark as remark6_1_0_ 
    from catalog this_
    where this_.name=$1 limit $2
    Parameter: $1 = 'a', $2 = '1'

    select this_.id as id1_2_0_, this_.version as version2_2_0_, this_.catalog_id as catalog_3_2_0_, this_.date_created as date_cre4_2_0_, this_.last_updated as last_upd5_2_0_, this_.pos as pos6_2_0_, this_.remark as remark7_2_0_
    from element this_
    where this_.catalog_id=$1 and this_.pos=$2 limit $3
    Parameter: $1 = '10', $2 = '2', $3 = '1'

    第2版​​和第3版的SQL语句:
    select this_.id as id1_2_1_, this_.version as version2_2_1_, this_.catalog_id as catalog_3_2_1_, this_.date_created as date_cre4_2_1_, this_.last_updated as last_upd5_2_1_, this_.pos as pos6_2_1_, this_.remark as remark7_2_1_, catalog_al1_.id as id1_1_0_, catalog_al1_.version as version2_1_0_, catalog_al1_.date_created as date_cre3_1_0_, catalog_al1_.last_updated as last_upd4_1_0_, catalog_al1_.name as name5_1_0_, catalog_al1_.remark as remark6_1_0_ 
    from element this_ inner join catalog catalog_al1_
    on this_.catalog_id=catalog_al1_.id
    where (catalog_al1_.name=$1) and this_.pos=$2
    Parameter: $1 = 'a', $2 = '2'

    关于grails - 优化Grails查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29108445/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com