gpt4 book ai didi

postgresql - 将空列添加到 postgres 表会导致锁定吗?

转载 作者:行者123 更新时间:2023-11-29 11:08:14 24 4
gpt4 key购买 nike

我想我在某处读到过,在 postgres 数据库上运行 ALTER TABLE foo ADD COLUMN baz text 不会导致读取或写入锁定。设置默认值会导致锁定,但允许空默认值会阻止锁定。

不过我在文档中找不到这个。谁能指出一个明确说明这是否属实的地方?

最佳答案

文档中提到了不同种类的锁以及何时使用它们 Table-level Locks .例如,Postgres 11 的 ALTER TABLE 可能会获取 SHARE UPDATE EXCLUSIVESHARE ROW EXCLUSIVEACCESS EXCLUSIVE 锁.

Postgres 9.1 到 9.3 声称支持上述三个中的两个,但实际上 forced Access Exclusive for all variants of this command .此限制为 lifted in Postgres 9.4ADD COLUMN 在设计上仍保留在 ACCESS EXCLUSIVE

查看源代码很容易,因为在src/backend/commands/tablecmds.c 中有一个函数专门用于建立此命令在各种情况下所需的锁定级别:AlterTableGetLockLevel


关于持有锁的时间,一旦获得:

  • 当列的默认值为 NULL 时,列的添加应该非常快,因为它不需要表重写:它只是目录中的更新。
  • 当列具有非 NULL 默认值时,它取决于 PostgreSQL 版本:对于版本 11 或更高版本,不会立即重写所有行,因此它应该与 NULL 情况一样快。但是对于版本 10 或更早的版本,表格会被完全重写,因此根据表格的大小,它可能会非常昂贵。

关于postgresql - 将空列添加到 postgres 表会导致锁定吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19525083/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com