我在我的PostgreSQL 9.6数据库中有一张有300万行的表。这个表已经有了一个空位图(它有另外两个DEFAULT NULL
字段)。我想给这个表添加一个新的布尔可空列。我困扰于这两个语句之间的区别:
ALTER TABLE my_table ADD COLUMN my_column BOOLEAN;
ALTER TABLE my_table ADD COLUMN my_column BOOLEAN DEFAULT NULL;
我认为这些语句没有区别,但是:
- 我在文档中找不到任何证据。文档告诉我们为新列提供
DEFAULT
值将使PostgreSQL重写所有元组,但我不认为对于这种情况是真的,因为默认值是NULL
。 - 我在这个表的副本上运行了一些测试,第一个语句(没有
DEFAULT NULL
)比第二个语句花费了更多的时间。我不明白为什么。
我的问题是:
- PostgreSQL会为这两个语句使用相同的锁类型(
ACCESS EXCLUSIVE
)吗? - 如果我使用
DEFAULT NULL
,PostgreSQL会重写所有元组以添加NULL
值吗? - 这两个语句之间有什么区别吗?