2017-02-02 49 views
3

正在運行Postgres-9.5。我有一張大桌子,我正在做ALTER TABLE table SET UNLOGGED。我已經放棄了所有針對表的外鍵約束,因爲FK引用的表不能被記錄。查詢花費了大約20分鐘,並且一直佔用100%的CPU。我可以理解,需要很長時間才能使表格被記錄下來,但是使其沒有記錄似乎並不困難......但是這樣嗎?Postgres SET UNLOGGED需要很長時間

有什麼我可以做的,使其更快地設置表unlogged?

+0

也許它正在等待鎖? https://wiki.postgresql.org/wiki/Lock_Monitoring –

+0

我每隔幾秒就通過查詢'pg_stat_activity'來監控它,並且沒有看到'waiting'列設置爲真,另外我看到一直很高的CPU使用率,這將表明它並沒有等待。另外,我知道自從它在一個獨立的測試數據庫以來,沒有其他查詢運行。 – sudo

+0

@NickBarnes啊,那就是解決方案。對我來說似乎很奇怪,設置unlogged會需要重寫,但我真的不知道Postgres是如何工作的。 – sudo

回答

4

SET UNLOGGED涉及一個表重寫,所以對於一個大型表,你可以期待它需要一段時間。

正如你所說,似乎並不像表UNLOGGED應該是那麼困難。而簡單地轉換表不是那很難;這個複雜的因素是需要使其安全。 UNLOGGED表具有與其關聯的附加文件(init fork),並且無法將此文件的創建與其餘提交同步。

所以取而代之,SET UNLOGGED構建表的副本,其中附接一個init叉,然後在交換新relfilenode,其提交可以原子處理。更有效的實施方式將是可能的,但不是沒有改變未記錄表格的表示(其早於SET UNLOGGED很長一段時間)或COMMIT本身的邏輯,這兩者都被認爲對於這個相對次要的特徵太侵入。您可以閱讀pgsql-hackers list上的設計背後的討論。

如果你真的需要最大限度地減少停機時間,你可以採取類似的方法,通過SET UNLOGGED採取:創建一個新UNLOGGED表,整個複製所有的記錄,簡單而您同步過去幾年的變化鎖定舊錶,完成後將新表換成RENAME