Insert

Postgres 10.3:刪除插入後表的大小增加

  • March 18, 2020

我對 Postgres 比較陌​​生,我看到的問題似乎有點奇怪。也許您作為專家對此有所了解。

我有一張桌子(大約 300 萬行和 200 列)。為了填充新數據,該表會定期被刪除並完全重新載入。我不喜歡這種完全重新載入的方法,所以我稍微改變了這個過程:現在需要重新計算的記錄被刪除並從頭開始載入——其他數據保持不變。這種方法比完全重新載入要快得多,但是在刪除和插入之後,表會非常膨脹(3-5 次,具體取決於刪除插入的記錄數)。

我明白在執行 DELETE 語句時數據並沒有被物理刪除。我知道死的元組仍然存在。我的期望是,如果我在刪除數據、部分刪除數據、執行 VACUUM ANALYZE、重新載入數據並再次建構索引之前刪除所有索引(完全按照這個順序),表本身和索引都不會膨脹。但顯然,我錯了。

我在這裡缺少什麼實質性的東西嗎?

更新:有趣的是“SELECT relname, n_dead_tup FROM pg_stat_user_tables WHERE relname = ’table_name’” 表明沒有死元組。現在我更加疑惑了。

更新 2:我想出了腹脹背後的原因。在“增量”重新載入之後還有一個步驟會更新整個表的幾列(因為它們不能在增量模式下載入)。此更新使表的大小增加。

VACUUM如果空閒空間恰好在末尾,只會縮小數據文件。你可能想要的是一個VACUUM FULL. 但是請注意一些警告:

  1. 它會在執行時鎖定表(可能是一段時間
  2. 它將需要與表等效的臨時空間

但是當它完成時,最終使用的空間將足以容納您擁有的實際數據。

我認為這VACUUM ANALYZE對回收可用空間沒有幫助。它只會更新索引統計資訊。你可以VACUUM不執行ANALYZE,我認為如果表是空的,它會立即回收空間(否則它只會更新可用空間映射)。

但是如果你完全刪除舊行,TRUNCATE TABLE會好很多:它會立即回收磁碟空間。

引用自:https://dba.stackexchange.com/questions/206348