【问题标题】:Most efficient way to update database更新数据库的最有效方法
【发布时间】:2024-01-14 13:57:01
【问题描述】:

我有一张不时自动更新的表格(比如每天)。所有更新的字段都是TEXT 类型,并且可能包含大量数据。我绝对知道的是,数据不会有太大变化。通常最多添加或删除 30 个字符。 那么什么会更有效率呢?以某种方式合并更改或删除旧数据并检索新数据? 而且,如果合并方式是这样做的方式,我应该怎么做?是否有任何关键字或其他东西可以使这更容易和更有效?

P.S 总的来说,我对数据库完全陌生,这是我第一次创建和使用数据库,如果这是一个愚蠢的问题,请见谅

【问题讨论】:

  • 如果可能的话,将你的字段拆分成它们的逻辑部分,而不是将它们存储为一个大的text blob,这样你就可以只更新实际需要更新的块。尝试规范化数据并对其进行结构化。
  • @CraigRinger 是的,我稍后会缩放它,但我需要让它工作到星期五,所以现在我会像我发布我的帖子一样做。

标签: performance postgresql sql-update auto-update


【解决方案1】:

由于MVCC 模型,PostgreSQL 总是 为单个UPDATE 中应用的任何 组更改写入新行。没关系,你改变多少。没有“合并方式”。

类似于(但不一样)删除行并插入新行。

由于您的列显然很大,它们将是TOASTed,这意味着它们被压缩并离线存储在单独的表中。在UPDATE 中,如果这些列保持不变,则可以按原样保留,因此UPDATEDELETEINSERT 便宜得多。引用the manual here

UPDATE 操作期间,未更改字段的值通常为 按原样保存;因此会产生具有线外值的行的UPDATE 如果没有任何外线值发生变化,则没有 TOAST 成本。

如果您的行有 很多 列并且只有一些列得到很多更新,那么拥有两个具有 1:1 关系的单独表可能会有所帮助。但这是极端情况。

【讨论】: