2014-11-21 768 views
0

我是Postgresql的新成員,並不完全知道如何管理分區表。
我有基於一天的分區表。在插入數據之前,觸發器檢查日期並放入相應的子表中。
例如。
11.15.2014 - 插入名爲11-15-2014_log的表中。
11.16.2014 - 插入名爲11-16-2014_log的表中。
現在我想創建將刪除舊的子表的函數,例如,超過90天的表。 我應該根據它的表名找到並刪除子表(因爲它包括創建日期)或者我應該在主表中找到超過90天的記錄嗎?
任何建議或提示將不勝感激。謝謝。postgresql刪除分區表

+0

不知道您正在處理的數據量有多少或運行頻率如何,甚至不知道它使用什麼語言,這使得建議任何事情都很棘手。你可能會顯示創建表的觸發器功能嗎? – Lucas 2014-11-21 03:30:28

+1

這些表中的每一個平均有多大?即,你是否真的需要分割它們。 – khampson 2014-11-21 03:31:09

回答

0

我只是刪除從主表舊的記錄,是這樣的:

DELETE FROM master_table WHERE creation_date < 'today' - INTERVAL '90 days'; 

但是我的建議是這個時間查詢到最睏倦時間運行的服務器,比如比如上午5:00

0

對於任何想要如何刪除PostgreSQL中的表分區的人來說,這裏是現代的答案。

解決方案不是使用DELETE語句,因爲這會刪除數據而不刪除保存數據的相應表分區。 OP問及管理分區表而不是刪除記錄,因此任何使用DELETE語句的解決方案都會增加不必要的刪除記錄的數據庫開銷,留下空分區表,並完全忽略使用分區的主要優點之一;當表不再有用時刪除表格。

在這種情況下,解決方案必須是刪除不再需要的分區表。我已經在我的生產環境中編寫了一個解決方案來解決這個問題,答案是here

要解決OP的問題,我寫的函數可以使用兩個微小修訂來修改fullTablename變量和日期格式。所述fullTablename可變線必須從

fullTablename := base_table_name || '_' || to_char(startTime, dateFormat); 

改變爲YYYY-MM-DD_log格式這樣

fullTablename := to_char(startTime, dateFormat) || '_' || base_table_name; 

然後日期格式需要從

WHEN partition_plan='day' THEN 'YYYYDDD' 

被稍微修改,以所述表格命名約定

WHEN partition_plan='day' THEN 'YYYY-MM-DD' 

然後調用執行清理功能的SQL查詢可以從日常維護腳本中調用這樣的:

SELECT public.drop_partitions(current_date-180, 'public', 'log', 5, 'day'); 

這將下降早於天的YYYY-MM-DD_log表10天前。對於初始運行來刪除幾十個或幾百個舊的表分區,可以將其設置爲一個更高的值,以達到所需的效果。