来来来,给这个 sql 来个优化方案 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
aw2350
V2EX    数据库

来来来,给这个 sql 来个优化方案

  •  
  •   aw2350 2024-01-30 11:36:40 +08:00 3193 次点击
    这是一个创建于 673 天前的主题,其中的信息可能已经有所发展或是发生改变。

    SELECT kdojhad, k3jyqb4, ( ( ( SELECT MAX ( calc_65b868adfd5b141878679de2 ) FROM ( SELECT ( SUM ( t623be1f4fd5b1419766ff0b8."c2" ) ) AS calc_65b868adfd5b141878679de2, t623be1f4fd5b1419766ff0b8."c10" AS dimension0 FROM t623be1f4fd5b1419766ff0b8 WHERE ( ( t623bef4fd5b1419766ff0b8."c11" = k3jyqb4 ) AND ( t623be1f4fd5b1419766ff0b8."c10" = kdojhad ) ) GROUP BY dimension0 ) AS res ) ) ) AS kxxz3vy FROM ( SELECT t623be1f4fd5b1419766ff0b8."c11" AS k3jyqb4, t623be1f4fd5b1419766ff0b8."c10" AS kdojhad FROM t623be1f4fd5b1419766ff0b8 GROUP BY kdojhad, k3jyqb4 ) AS dataSource

    16 条回复    2024-03-20 18:48:18 +08:00
    RiESA
        1
    RiESA  
       2024-01-30 11:42:15 +08:00   6
    SELECT kdojhad,
    k3jyqb4,
    ( (
    (SELECT MAX ( calc_65b868adfd5b141878679de2 )
    FROM
    (SELECT ( SUM ( t623be1f4fd5b1419766ff0b8."c2" ) ) AS calc_65b868adfd5b141878679de2,
    t623be1f4fd5b1419766ff0b8."c10" AS dimension0
    FROM t623be1f4fd5b1419766ff0b8
    WHERE ( ( t623be1f4fd5b1419766ff0b8."c11" = k3jyqb4 )
    AND ( t623be1f4fd5b1419766ff0b8."c10" = kdojhad ) )
    GROUP BY dimension0 ) AS res ) ) ) AS kxxz3vy
    FROM
    (SELECT t623be1f4fd5b1419766ff0b8."c11" AS k3jyqb4,
    t623be1f4fd5b1419766ff0b8."c10" AS kdojhad
    FROM t623be1f4fd5b1419766ff0b8
    GROUP BY kdojhad, k3jyqb4 ) AS dataSource


    帮你优化了一下格式,不用谢
    aw2350
        2
    aw2350  
    OP
       2024-01-30 11:49:11 +08:00
    @RiESA 谢谢 好人一生平安
    houfeibin
        3
    houfeibin  
       2024-01-30 12:20:12 +08:00
    这段 SQL 查询语句可以进行一些优化。首先,可以将内部嵌套的子查询提取为一个临时表,以减少计算的复杂性。其次,可以使用 JOIN 操作来简化查询逻辑。

    以下是优化后的 SQL 查询语句:

    WITH temp AS (
    SELECT t."c10" AS kdojhad, t."c11" AS k3jyqb4, SUM(t."c2") AS calc_65b868adfd5b141878679de2
    FROM t623be1f4fd5b1419766ff0b8 t
    GROUP BY t."c10", t."c11"
    )
    SELECT t1.kdojhad, t1.k3jyqb4, t2.max_calc_65b868adfd5b141878679de2 AS kxxz3vy
    FROM (
    SELECT t."c10" AS kdojhad, t."c11" AS k3jyqb4
    FROM t623be1f4fd5b1419766ff0b8 t
    GROUP BY t."c10", t."c11"
    ) t1
    JOIN (
    SELECT MAX(calc_65b868adfd5b141878679de2) AS max_calc_65b868adfd5b141878679de2
    FROM temp
    ) t2
    通过使用临时表和 JOIN 操作,可以将原始查询语句的嵌套子查询和多层括号减少,提高查询效率和可读性。请根据你的实际环境和需求进行测试和调整。
    aw2350
        4
    aw2350  
    OP
       2024-01-30 12:39:24 +08:00
    @houfeibin gpt 的回答明显是有问题的
    tradewind
        5
    tradewind  
       2024-01-30 13:49:40 +08:00
    第一反应是这样,但是没有造数据不确定有没有问题以及是不是有优化,最好 desc 看看(

    ```sql
    select tmp.kdojhad,
    tmp.k3jyqb4,
    max(tmp.calc_65b868adfd5b141878679de2) as kxxz3vy
    from (select t.kdojhad,
    t.k3jyqb4,
    sum(t.c2) as calc_65b868adfd5b141878679de2,
    t.c10 as dimension0
    where 1
    group by t.kdojhad, t.k3jyqb4, dimension0) as tmp
    where 1
    group by tmp.kdojhad, tmp.k3jyqb4
    ```

    btw 为啥不用代码处理数据
    haimianbihdata
        6
    haimianbihdata  
       2024-01-30 14:01:43 +08:00 via Android
    @houfeibin with as 不是只是提高美观的吗?这个不会提高性能吧?
    aw2350
        7
    aw2350  
    OP
       2024-01-30 14:04:19 +08:00
    @haimianbihdata 会,这个 gpt 的思路是没问题的,就是细节不对。原始的 sql 有关联子查询,影响查询效率。使用 with 生成一个结果集,然后用 join 链接的方式 会提升效率
    aw2350
        8
    aw2350  
    OP
       2024-01-30 14:06:14 +08:00
    @tradewind 这个 sql 并不是手写的,是由业务解析器动态生成的, 所以我要根据场景去优化解析器,而不是具体的 sql
    zzNucker
        9
    zzNucker  
       2024-01-30 14:06:48 +08:00
    @houfeibin 这种代码问题不要贴 GPT 的回答,大概率代码有问题,浪费大家时间
    houfeibin
        10
    houfeibin  
       2024-01-30 14:35:06 +08:00
    @zzNucker 我觉得使用 gpt 就是给自己提供一个解题思路,并不会完全相信 gpt 回答的东西
    faithxy
        11
    faithxy  
       2024-01-30 14:38:39 +08:00
    SELECT SUM(paid) FROM t WHERE username='aaa';
    借楼这个怎么优化 username 是索引,按月分表大概五百万数据,查询频率很高还需要实时数据
    thisIsDing
        12
    thisIsDing  
       2024-01-30 14:46:57 +08:00
    简化了一下 SQL ,速度还是要看数据量和索引吧。

    diff 信息 https://www.diffchecker.com/gk5R2vD8/

    ```sql
    SELECT
    kdojhad,
    k3jyqb4,
    (((
    -- 原来的分组字段已在筛选条件中,所有只有一组,那就不用分组,MAX 也不必取
    SELECT
    SUM(t623be1f4fd5b1419766ff0b8."c2") AS calc_65b868adfd5b141878679de2
    FROM t623be1f4fd5b1419766ff0b8
    WHERE (
    ( t623be1f4fd5b1419766ff0b8."c11" = k3jyqb4 )
    AND ( t623be1f4fd5b1419766ff0b8."c10" = kdojhad )
    )
    ))) AS kxxz3vy
    FROM (
    -- distinct 应该比 group 快
    SELECT distinct
    t623be1f4fd5b1419766ff0b8."c11" AS k3jyqb4,
    t623be1f4fd5b1419766ff0b8."c10" AS kdojhad
    FROM t623be1f4fd5b1419766ff0b8
    ) AS dataSource
    ```
    aw2350
        13
    aw2350  
    OP
       2024-01-30 14:49:25 +08:00   1
    @faithxy 按照你的 描述,既然这个表已经 按月分表了,那么肯定有个字段记录的插入时间,假设这个插入时间是个 unix 时间戳 int64 类型
    假如 你的 计算只是简单的 SUM(PAID) ,那么完全可以建一个表用来记录当日之前每个人的 SUM 值,然后只需 计算当日新增的 SUM+ 当日之前的 SUM 即可,当日之前的 SUM 值由一个任务半夜生成
    如果你用的是一些新型数据库,对于时序数据有很多实时分析插件,可以自己去了解一下
    winnievinnie
        14
    winnievinnie  
       2024-01-30 14:59:13 +08:00
    ChatGPT3.5:

    你的 SQL 查询包含嵌套查询和聚合函数,要进行优化可能需要根据具体情况进行调整。以下是一些建议的优化方式,但请注意,最终的优化取决于数据库的结构和数据分布。

    使用 JOIN 替代子查询:将子查询转换为 JOIN 操作可能提高性能。这取决于具体的数据库系统和索引情况。
    sql
    Copy code
    SELECT
    t1.kdojhad,
    t1.k3jyqb4,
    MAX(t2.calc_65b868adfd5b141878679de2) AS kxxz3vy
    FROM
    (SELECT t623be1f4fd5b1419766ff0b8."c11" AS k3jyqb4,
    t623be1f4fd5b1419766ff0b8."c10" AS kdojhad
    FROM t623be1f4fd5b1419766ff0b8
    GROUP BY kdojhad, k3jyqb4) AS t1
    JOIN
    (SELECT
    SUM(t623be1f4fd5b1419766ff0b8."c2") AS calc_65b868adfd5b141878679de2,
    t623be1f4fd5b1419766ff0b8."c10" AS dimension0
    FROM t623be1f4fd5b1419766ff0b8
    GROUP BY dimension0) AS t2
    ON t1.kdojhad = t2.dimension0 AND t1.k3jyqb4 = k3jyqb4
    GROUP BY t1.kdojhad, t1.k3jyqb4;
    索引优化:确保涉及到的列上有合适的索引,特别是连接条件的列和 GROUP BY 子句的列。

    避免不必要的嵌套:确保嵌套查询的存在是有必要的,如果可以在单一查询中完成,可以尝试简化。

    请注意,具体的优化可能需要根据数据库系统的特性和实际数据情况进行调整,建议在实际环境中测试性能。
    lookStupiToForce
        15
    lookStupiToForce  
       2024-01-30 15:37:42 +08:00   1
    鉴于 po 主连格式化的诚意都没有,我也丢一个没诚意的答案
    select a, b, sum(c) as k3jyqb4
    from t
    group by a, b
    自行感悟
    dyv9
        16
    dyv9  
       2024-03-20 18:48:18 +08:00 via Android
    @faithxy 晚上把上个月数据汇总,只有当月查实时,过去的直接拿以前计算好的相加。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5623 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 06:14 PVG 14:14 LAX 22:14 JFK 01:14
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86