2016-08-29 103 views
0

我有一個大約800GB的龐大數據庫。當我試圖運行一個將某些變量分組並且彙總結果的查詢時,它在運行幾個小時後停止。 Postgres發出消息說磁盤空間已滿。在查看統計數據後,我意識到dB具有大約400GB的臨時文件。我相信這些臨時文件是在我運行查詢時創建的。我的問題是如何刪除這些臨時文件。另外,我該如何避免這些問題 - 使用遊標或for循環不能一次處理所有數據?謝謝。刪除postgresql中的臨時文件

我使用的是Postgres 9.2

+1

你是如何「看統計」,什麼「臨時文件」被你說了嗎?臨時表在會話結束時被刪除,因此關閉會話然後打開一個新會話應該可以解決問題。 – Patrick

+0

上面的內容應該可以轉移到答案上。 – d1ll1nger

+0

最可能的原因是(無意識的)Carthesian產品。 – joop

回答

1

當查詢完成後不會被刪除,它們會在base/pgsql_tmp查詢執行過程中創建的臨時文件。您不應該手動刪除它們。
這些文件與臨時表無關,它們用於存儲不適合work_mem的大型散列或排序操作的數據。

確保查詢已完成或取消,請嘗試連續運行CHECKPOINT兩次,查看文件是否仍然存在。如果是的話,那是一個錯誤; PostgreSQL服務器在磁盤空間不足時崩潰了嗎?

如果你真的有base/pgsql_tmp舊文件不會自動刪除,我認爲它是安全的手動刪除它們。但在這種情況下,我會用PostgreSQL提交一個bug。

如果執行計劃需要對大型結果集進行排序或需要創建大型哈希值,則無法避免大型臨時文件。遊標不會幫助你。我想用for-loops表示將處理從數據庫移動到應用程序代碼–,這通常是一個錯誤,並且只會將問題從數據庫移動到另一個處理效率較低的地方。

更改您的查詢,以便它不必排序或散列較大的結果集(請檢查EXPLAIN)。我知道這聽起來不是很有幫助,但沒有更好的辦法。無論如何,你可能必須這麼做,或者幾個小時的運行時間可以接受嗎?

+0

謝謝。我正在使用一些自定義聚合函數,我相信這是創建大型臨時文件。 EXPLAIN顯示聚集函數正在排序數據。我想知道是否有辦法避免在聚合函數中進行排序。我對結果的順序不感興趣。幾個小時的運行時間是可以接受的,因爲這是對數據的一次性處理,但是大的臨時文件正在停止查詢執行。謝謝。 –

+0

帶*自定義聚合函數*是指第三方C函數?不知道如何定義聚合函數以及'EXPLAIN'輸出是什麼樣子,很難回答這個問題。 –

-1

試試這個

SELECT temp_files AS "Temporary files" 
    , temp_bytes AS "Size of temporary files" 
FROM databse_name db;