jpa*_*dvo 26 postgresql alter-table
我想我在某个地方读到ALTER TABLE foo ADD COLUMN baz text在postgres数据库上运行不会导致读或写锁定.设置默认值会导致锁定,但允许null默认值会阻止锁定.
但是,我在文档中找不到这个.任何人都可以指出一个地方,明确地说,如果这是真的吗?
Dan*_*ité 25
表级锁中的文档中提到了不同类型的锁以及何时使用它们
.例如,Postgres的11的ALTER TABLE可获取SHARE UPDATE EXCLUSIVE,SHARE ROW EXCLUSIVE或ACCESS EXCLUSIVE锁.
Postgres 9.1到9.3声称支持上述三个中的两个但实际上强制Access Exclusive执行此命令的所有变体.这种限制在Postgres 9.4中被取消,但ADD COLUMN仍然ACCESS EXCLUSIVE按设计进行.
检查源代码很容易,因为在各种情况下AlterTableGetLockLevel,有一个专门用于建立此命令所需的锁级别的函数:in src/backend/commands/tablecmds.c.
关于锁定持有多长时间,一旦获得:
ale*_*ius 24
添加新的空列将在非常短的时间内锁定表,因为不需要重写磁盘上的所有数据.添加具有默认值的列需要PostgreSQL创建所有行的新版本并将其存储在磁盘上.在此期间,表格将被锁定.
因此,当您需要将具有默认值的列添加到大表时,建议先添加空值,然后以小部分更新所有行.这样你就可以避免磁盘上的高负载,并允许autovacuum完成它的工作,所以你不会最终使表大小加倍.
Leo*_*Leo 12
http://www.postgresql.org/docs/current/static/sql-altertable.html#AEN57290
"添加具有非null默认值的列或更改现有列的类型将需要重写整个表和索引."
因此,文档仅指定何时不重写表.总会有锁,但如果不重写表,它将会非常短.
| 归档时间: |
|
| 查看次数: |
17732 次 |
| 最近记录: |