我在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”
为什么要尝试并发删除某些内容?
答案 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);