2016-04-27 74 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

是的,如果你這樣做,你在書寫過程中得到一個獨家鎖定在桌子上,沒有人可以寫。 –