PostgreSQL
数据库并发创建索引
通常情况下,
PostgreSQL
数据库在创建索引的时会锁定表以防止数据写入,然后对
表做全表扫描,最终完成创建索引的操作。在此过程中,其他用户仍然可以读取表数据,
但是插入、更新、删除等操作将一直被阻塞,直到索引创建完毕。如果这张表是数据更新
较频繁且数据量比较大的表,那么创建索引可能需要几十分钟,甚至数个小时,这段时间
内都不能做任何插入、删除、更新操作,这在大多数的生产数据库中都是不可接受的。鉴
于此,
PostgreSQL
数据库支持在不长时间阻塞更新的情况下建立创建索引,这是通过在
CREATE INDEX
中 加
CONCURRENTLY
选 项 来 实 现 的 。 当 该 选 项 被 启 用 时 ,
PostgreSQL
数据库会执行表的两次扫描,因此该方法需要更长的时间来建索引。尽管如
此,该选项也是很有用的。
下面来做一个测试。
先建一张测试表:
test=# CREATE TABLE test01(id int primary key, name varchar(50));
插入测试数据:
test=# INSERT INTO test01 select generate_series(1,5000000),
generate_series(1,5000000);
这时打开两个
psql
窗口,在一个窗口中建索引:
[PostgreSQL@PostgreSQLTest ~]$ psql test
psql (14.6 (230203))
输入
"help"
来获取帮助信息
.
test=# \timing
评论