【问题标题】:Optimized update优化更新
【发布时间】:2015-04-10 17:32:39
【问题描述】:

我一直在尝试对包含 2 列(id 和 nb_send)的巨大表(大约 600 万行)进行大规模更新

我只需要增加一列 (nb_send)

这是查询:

UPDATE nb_send 
  SET n_nb_send = n_nb_send + 1 
WHERE n_id = ( .., .., .. with the 100K ids, etc.. )

当我想更新 100K 行时,它需要很长时间(我从来没有等到最后,因为它超过了 40 分钟)而且我想在不到 2 分钟的时间内完成。

【问题讨论】:

  • 您或许可以提供一些关于什么是花时间的提示?您是否使磁盘 I/O 饱和?你有外键日志吗?定位这 100K 行是否需要很长时间?只有您可以访问您的特定机器,除非您分享一些详细信息,否则没有人能说出非常有用的信息。
  • 在较小的事务中进行更新吗? (尝试例如 1 - 10k 行/事务)
  • 更新 10 万条记录需要 40 分钟?听起来有些记录被另一个进程锁定了。检查 pg_stat_activity 等待活动。
  • “它不工作”很少是对问题的有用描述。

标签: sql postgresql optimization


【解决方案1】:

尝试删除此表中的所有索引(以及使用 nb_send 列的表中的索引),然后更新 nb_send 并重新创建所有索引。

我希望这会有所帮助

【讨论】:

    【解决方案2】:

    这种情况的解决方案不是创建一个列(作为计数器)并更新它,而是创建一个新表来计算您想要的所有信息。

    “WHERE id =”根本没有针对大表进行优化。

    【讨论】:

    • WHERE id = (.., ..,) 是无效的 SQL 开头。如果你需要使用WHERE id IN (..., ...)
    • 我的意思是 IN 而不是 =
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    • 2012-03-22
    • 1970-01-01
    • 2021-07-10
    • 2015-11-08
    • 2022-01-24
    • 2013-01-16
    相关资源
    最近更新 更多