Postgresql

添加 postgres 索引是同時逐漸佔用磁碟空間還是一次全部佔用?

  • April 12, 2019

我在磁碟空間非常低的 Postgres 9.6 伺服器上添加了一個唯一索引(同時,在幾個小時甚至幾天的過程中,在 50 億個 bigint 的列上,所有這些都是 NULL)。我可以看到它將磁碟使用率從 94% 提高到了 95%,我不確定它是否已預留出它想要的所有空間,或者它是否會稍後向磁碟寫入更多內容並在周末關閉伺服器。Postgres 是提前為索引留出磁碟空間,在整個索引過程中逐漸使用更多的磁碟空間,還是間歇性地寫入?

它緩慢地分配空間。

首先,它將所需的所有數據分類到臨時文件中,並隨時分配。然後它建立索引,同時分配它。然後它會刪除臨時文件。在並發索引的情況下,它會再次將一部分數據排序到臨時文件中,以便它可以檢測到第一次錯過的任何並發寫入的數據,並在進行時再次分配。最後它再次刪除那些臨時文件,索引就完成了。如果您有另一個可用的分區/驅動器,您可以使臨時文件進入該驅動器上單獨的temp_tablespaces,而不是與主文件共享空間。

此外,您可以創建一個部分索引,如create index CONCURRENTLY ON foobar (x) where x is not null;. 由於該列全為 NULL,因此將沒有條目,並且幾乎不佔用任何空間——無論是建構它,還是在最終產品中。

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