2016-04-27 34 views
0

我有查询删除记录从非常大的表有3千万records.I删除记录在小块中,就像一个小操作10k记录。当我运行这个查询5次它工作正常。来自postgresql中删除操作的事务块。日志?

但之后它不出来。现在甚至无法删除10条记录。我怀疑可能是它产生了巨大的事务日志。如果是这样,可以请一些机构帮我解决如何清除事务日志?如果有任何事情,我必须改变我的删除查询?任何查询,找出日志文件的大小?我现在用的Postgres 9.1

WITH ids_to_delete as(
    SELECT rh.dp_value_id 
    FROM raw_dp_links rh LEFT OUTER JOIN dp_values dp 
    ON rh.dp_value_id=dp.dp_value_id 
    where dp.dp_value_id is null 
    limit 10000 
    ) 
    delete from raw_dp_links where dp_value_id in (select dp_value_id from ids_to_delete) 
+2

很可能您的查询正在等待锁定。看到这里:https://wiki.postgresql.org/wiki/Lock_Monitoring如果WAL段的大小(在Postgres中没有“事务日志”这样的东西)太大了,你会得到一个错误信息 –

+0

是的你是正确的,因为当我重新启动我的数据库它工作得很好。但为什么锁获得简单的删除操作? – SUDARSHAN

+1

您的删除语句不会自行锁定。您可能有其他事务修改这些行。或者修改引用表的某些外键。请阅读维基页面并运行这些语句来调查造成这些锁定的原因。没有更多信息是不可能的。 –

回答

0

首先,PostgreSQL的事务日志大多是当你恢复(电源故障或点之后的某个时间恢复)或做复制时的一个因素。由于PostgreSQL处理磁盘存储的方式,来自事务处理的大型日志段不会给您带来问题。 PostgreSQL在异步垃圾收集(autovacuum)中使用堆表(不是按照索引排序),因此日志段唯一的问题是事务提交。

更有可能是来自同一张表上其他写入操作的行锁定。发生这种情况时,PostgreSQL无法安全地知道该做什么,直到其他事务完成后才会等待。

+0

好吧,我认为你是对的...所以我可以运行这第一个ALTER TABLE table_name DISABLE TRIGGER ALL;那么我认为它应该工作.. – SUDARSHAN

+0

是的,如果你这样做,你在书写过程中得到一个独家锁定在桌子上,没有人可以写。 –