我在Postgres中創建了一組分區表,並開始通過主表插入很多行。當加載過程在我身上爆發時,我意識到我應該已經宣佈id行BIGSERIAL(BIGINT帶有序列,在幕後),但無意中將其設置爲SERIAL(INTEGER)。現在我已經加載了幾十億行,我試圖將列更改爲BIGINT。這個過程似乎有效,但需要很長時間。所以,實際上,我不知道它是在工作還是掛起。我寧願不重新啓動整個加載過程。如何在Postgres中更改一組分區表?
有什麼建議嗎?
我在Postgres中創建了一組分區表,並開始通過主表插入很多行。當加載過程在我身上爆發時,我意識到我應該已經宣佈id行BIGSERIAL(BIGINT帶有序列,在幕後),但無意中將其設置爲SERIAL(INTEGER)。現在我已經加載了幾十億行,我試圖將列更改爲BIGINT。這個過程似乎有效,但需要很長時間。所以,實際上,我不知道它是在工作還是掛起。我寧願不重新啓動整個加載過程。如何在Postgres中更改一組分區表?
有什麼建議嗎?
重新啓動它(澄清編輯:再次重新啓動整個加載過程)。
更改列值需要新的行版本,並且指向舊版本的所有索引都要更新爲指向新版本。
此外,請查看您可以遵循的advise on populating databases的數量。從@archnid
更正:
改變列的類型會觸發一個表重寫,所以行版本是不是一個大問題,但它仍然需要大量的磁盤空間暫時。你通常可以通過查看被追加到數據庫目錄中哪些文件監控進展......
當你更新一行來改變它在PostgreSQL中,寫入了該行的新副本,然後再執行稍後進行一些清理以刪除原始文件。這意味着試圖通過更新來解決問題可能需要的時間比再次從頭開始加載所有數據所花費的時間更長 - 它比加載新副本更多的磁盤I/O,以及一些額外的處理時間。唯一的情況是你想要進行更新而不是重新加載,這是因爲原始加載效率非常低,例如,如果慢速客戶端程序插入數據,並且這是過程的瓶頸。
要確定進程是否仍在工作,請在運行top(UNIX-ish系統)或任務管理器(Windows)時查看它是否正在使用CPU。在Linux上,「top -c」甚至會向你展示PostgreSQL客戶端進程在做什麼。你可能只是希望它比原來的負載花費更少的時間,而不是,它仍然在運行而不是掛起。
好的。從您的回答中我不清楚您建議我重新啓動服務器,還是重做整個數據加載過程。你是否建議我重新加載數據庫,因爲無論如何,修改主表大概需要相同的時間? – punkish 2010-06-22 00:09:55
我也應該添加...我沒有任何索引在桌子上,甚至沒有主鍵。 – punkish 2010-06-22 00:28:49
我建議你重做整個加載過程,因爲修改表格需要很長的時間。然而,根本沒有索引可以消除大規模批量更新中的一個最大問題。剩下的問題是您需要兩倍的磁盤空間,然後完成後,一半的表格將爲空。我沒有最近的大型*繼承*表經驗,所以不知道這會對決策產生什麼影響。 – 2010-06-22 00:42:49