2015-11-12 43 views
2

在某些情況下,我們有一個非常大的表(100萬條記錄),我們需要爲其添加具有缺省值的布爾字段。 如果我們只添加列需要3分鐘,並且我們在相同的語句中添加3列需要相同的時間。在大型postgres表中添加帶缺省值的布爾型字段

$ALTER TABLE Job ADD COLUMN test BOOLEAN NOT NULL default false; 
ALTER TABLE 
Time: 186506.603 ms 

    $ALTER TABLE Job ADD COLUMN test BOOLEAN NOT NULL default false , 
    ADD COLUMN test1 BOOLEAN NOT NULL default false, 
    ADD COLUMN test2 BOOLEAN NOT NULL default false; 
    ALTER TABLE 
    Time: 179055.546 ms 

我們在Postgres 9.1上。有沒有一個postgres功能允許添加多個布爾字段與默認值在一個鏡頭?這是一個數據庫變更管理/升級解決方案。是否比使用臨時表複製並插入以將具有默認值的多個布爾字段添加到表更好?本博客中描述了臨時表格方法: http://blog.codacy.com/2015/05/14/how-to-update-large-tables-in-postgresql/

+2

「是否有postgres功能讓這種情況發生?」我不明白這個問題。 –

+0

使_what_發生? (順便說一下:100萬行遠非「非常大」) –

+0

當我們更新列中的值時,Postgres在磁盤中寫入一整行,棄用舊行,然後繼續更新所有索引。這相當於每行有一個INSERT和一個DELETE。所以在這種情況下,我們正在添加3個布爾字段,Postgres是在一次性添加這些字段?從頭開始創建新表比更新每一行更快。順序寫入比稀疏更新更快。我已經實現了一個使用臨時表的解決方案,但有了這個功能,我認爲不需要這樣的解決方案 – Shailendra

回答

3

您已經展示了最好的(簡單)方法 - 複合ALTER TABLE語句,它們一次性添加它們。

要做到這一點沒有一個長鎖,你必須在多個步驟。將該列添加爲不可用的默認值。添加默認值,但保留爲空。 UPDATE所有現有行添加新值,最好是批量添加。然後最後修改表格以添加not null約束。

+0

這是一件麻煩事,但遺憾的是避免長時間鎖定表的唯一可靠方法。 – Epigene