我在一个事务中运行了一个迁移查询,它是这样的:
alter table big_and_loaded_table
add column col1 bool;
update big_and_loaded_table set col1 = false;
看似很无辜,却执行了两分钟左右。此外,它“锁定”big_and_loaded_table
了:我的应用程序中涉及它的任何查询——读取和写入——都花了很长时间来执行,同一分钟左右。我根本不在我的应用程序中使用事务,以及任何类型的显式锁。
所以我有两个问题:
- 为什么迁移查询需要这么长时间才能执行?是因为交易吗?还是因为查询本身?
- 为什么它会锁定涉及 table 的应用程序查询
big_and_loaded_table
? - 将来我应该如何运行此类迁移?当我弄清楚前两个时,这一点可能没有任何意义。
Postgres 版本是 11.6。
Postgres 11 添加了一项功能,如果您添加具有默认值的列,则无需重写表。
如果你用过
该语句几乎会立即执行,并具有相同的效果。
但是 ALTER TABLE 语句将获得一个排他锁以防止在更改表时访问它,没有办法绕过它。