警告:在Postgres 9.2中的大表中创建索引时,表内正在进行并发删除

时间:2014-01-17 06:00:43

标签: postgresql concurrency

我在53 GB的大表上创建索引时遇到问题,所以我尝试多次创建此索引 代码是

do $$
begin
 if not exists (select * from pg_class where relname = 'index_usage_id_idx')       then
     create  index index_usage_id_idx on mytable (usage_id);
 end if; 
end $$;

我在pg_log目录中记录了很多日志,但是创建的索引不会停止并显示超过200 GB的日志,因此我的可用空间不足

2014-01-17 11:39:40语境:SQL语句“在mytable(usage_id)上创建索引index_usage_id_idx”
PL / pgSQL函数inline_code_block在SQL语句中的第46行
2014-01-17 11:39:40警告:表“mytable”

中正在进行并发删除

为什么要尝试并发删除某些内容?

2 个答案:

答案 0 :(得分:0)

另一个并发事务是尝试从表中删除行。

通过更改应用程序逻辑或创建规则,以某种方式推迟删除这些删除。

CREATE RULE
  _delete
AS ON
  delete
TO
  mytable
DO INSTEAD
  INSERT INTO my_table_to_be_deleted_later (...) VALUES (OLD...);

在这种情况下,您可能需要暂时删除FOREIGN KEY约束(如果my_table引用另一个表或被引用)。

或者,只需尝试CREATE INDEX CONCURRENTLY

答案 1 :(得分:0)

我在测试服务器(8.4)上遇到同样的问题,而没有任何其他客户端运行任何查询。

似乎似乎使用创建索引的concurrently关键字解决了这个问题。

在你的情况下:

CREATE INDEX CONCURRENTLY index_usage_id_idx ON mytable (usage_id);