【问题标题】:Postgres update vs defaultPostgres 更新与默认
【发布时间】:2019-11-25 20:21:24
【问题描述】:

在 Postgres 中哪个更快 - 创建具有默认值的列或创建可为空的列并手动更新具有常量值的列?

我问是因为 Postgres 中的更新是使用真空插入和删除。是否同样适用于使用默认创建列?

【问题讨论】:

  • 你应该测试它,但我认为更新会更慢。
  • 我会推动用例来指示要实施​​哪一个。如果只是出于好奇,您可以忽略此评论。我不知道哪个更快。
  • 我认为默认为 null 的可空列然后手动更新将比在创建时设置默认值更昂贵。但是,除非您有数十亿行要更新,否则我认为您采用哪种方式并不重要。
  • 您认为哪些用例很重要?
  • 如果你想要一个默认值,只需指定它。

标签: sql postgresql


【解决方案1】:

从 PostgreSQL v11 开始,创建具有非 NULL 默认值的列将不再重写表,因此会非常快。

即使在此之前,操作也可能会变得更糟,因为它一次重写整个表,而不是逐行更新(我没有对此进行测试)。这种情况的缺点是重写表会阻塞表上并发的SELECTs,而UPDATE不会。

【讨论】:

  • Postgres 中的更新是使用真空插入和删除。这同样适用于使用默认创建列吗?
  • 不 - 正如我所写,它只是元数据更改(v11 及更高版本)或整个表的重写(早期版本)。与更新完全不同。一方面,它不会使桌子变大。
  • @Vova:需要注意的是,优化只适用于非易失的默认表达式。否则(例如current_timestamp)它仍然会触发表重写。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多