暂无图片
pg -10中,create index concurrently 被卡住了??
我来答
分享
暂无图片 匿名用户
pg -10中,create index concurrently 被卡住了??

--sess 1

(postgres@[local]:5432)-[test]-#begin;
BEGIN
(postgres@[local]:5432)-[test]-#insert into t1(id) values(100);
INSERT 0 1


--sess 2


create index concurrently idx00 on t1(c1);

卡住了,

为什么加了并发仍然卡住?


pg -10 的版本

我来答
添加附件
收藏
分享
问题补充
2条回答
默认
最新
周波

(1)concurrently的含义
你首先得明白,concurrently选项的作用,在postgreSQL数据库中,带上concurrently创建索引的作用是可以不阻塞其它并发事务对表数据执行变更操作(包括:update、delete、insert);create index concurrently 对表施加SHARE UPDATE EXCLUSIVE锁,update、delete、insert对表施加ROW EXCLUSIVE,这两种锁互不排斥,这也是上一句话为什么不阻塞的原因;你的测试思路刚好反了,这个时候你应该测试:新启另一个会话,继续对t1表进行变更操作,看变更操作是否被阻塞。
(2)为什么创建索引被阻塞
在表t1的c1列上创建索引,数据库会去扫描t1表,为了保证索引数据的完整性和正确性,带上concurrently创建索引的操作会等待已存在的对相关表执行变更操作的事务提交或回滚,否则创建索引的SQL一直hang住,直到lock_timeout指定的时间达到,被取消执行。

暂无图片 评论
暂无图片 有用 2
清风生

CREATE INDEX CONCURRENTLY会扫描原表2次,如果有dml操作就会被阻塞。

暂无图片 评论
暂无图片 有用 1
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏