暂无图片
暂无图片
暂无图片
暂无图片
暂无图片
PostgreSQL数据库并发创建索引.docx
140
7页
3次
2024-10-29
100墨值下载
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
启用计时功能
.
test=# CREATE INDEX idx_test01_name on test01(name);
CREATE INDEX
时间:
8304.363 ms (00:08.304)
在另一个窗口中立即删除一条数据,我们可以看到,它一直在等另一个窗口中创建索
引的操作完成:
[PostgreSQL@PostgreSQLTest ~]$ hsql -d test
psql (14.6 (230203))
输入
"help"
来获取帮助信息
.
test=# \timing
启用计时功能
.
test=# DELETE FROM test01 where id=1;
DELETE 1
时间:
6425.432 ms (00:06.425)
在创建索引时启用
CONCURRENTLY
选项,命令如下:
test=# DROP INDEX idx_test01_name;
DROP INDEX
时间:
21.801 ms
test=# CREATE INDEX CONCURRENTLY idx_test01_name on test01(name);
CREATE INDEX
时间:
10344.364 ms (00:10.344)
of 7
100墨值下载
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文档的来源(墨天轮),文档链接,文档作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

关注
最新上传
暂无内容,敬请期待...
下载排行榜
Top250 周榜 月榜