You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

单条行更新SQL执行超一小时未完成,请求原因排查

问题分析与优化方案

你这条UPDATE语句用了相关子查询,意味着mints表的每一行(2万条)都会单独执行一次SELECT MAX(lamports) FROM postbalances WHERE account = mints.bc的查询。如果postbalances表的account字段没有建索引,每次子查询都会全表扫描500万条数据——2万次全表扫描带来的磁盘IO开销会让进程大部分时间都在等待磁盘读取完成,CPU自然处于空闲状态,这就是你看到CPU使用率低但查询跑不动的核心原因。

另外,虽然你觉得没有锁竞争,但如果mints表在更新时有其他读写操作,行锁等待也可能拖慢速度,但当前场景下IO瓶颈是主因。

优化步骤

  1. 给postbalances表加索引
    先给account字段创建索引,让子查询能快速定位数据:

    CREATE INDEX idx_postbalances_account ON postbalances(account);
    
  2. 改用非相关子查询批量更新
    先一次性计算出所有account对应的最大lamports,再关联mints表更新,避免重复扫描postbalances:

    UPDATE mints
    SET max_sol = agg.max_lamports
    FROM (
        SELECT account, MAX(lamports) AS max_lamports
        FROM postbalances
        GROUP BY account
    ) AS agg
    WHERE mints.bc = agg.account;
    

    这种方式只需要扫描postbalances表一次,再通过关联匹配mints数据,效率会提升几个数量级。

内容的提问来源于stack exchange,提问作者tymur999

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 17:01:03