Postgresql

將列添加到現有表中是不好的做法嗎?

  • April 9, 2021

相反:在創建新表時獲取所有列是否更好?

我正在開發一個新系統,新的要求一直在出現。最新的要求是為每個客戶添加一個新的標籤欄位,以便更容易在新舊系統之間關聯數據。新系統尚未投入生產,但遷移過程的一些測試執行已經完成。

目前刪除表並重新執行批量載入仍然可行,但未來呢 - 當系統中有大量實時數據並且需要新列時:它是否對例如,要導出數據,重新創建包含所有列的表,然後再次導入數據,而不是僅僅執行 ALTER TABLE ADD 列 …. ?

萬一有什麼不同,該解決方案基於 PostgreSQL 9.5,如果確實有不同,那麼了解哪些 DBMS 或多或少關心會很有趣。

是否在該列上創建索引會影響答案嗎?例如,當設置了唯一約束時。

ALTER TABLE是有原因的。更嚴重的是,除非您計劃擁有一個非常大的數據集,否則您不應該擔心按需添加新列。只有在沒有(重要的)數據之前,刪除和重新創建表才是可行的,這意味著ALTER TABLE ... ADD COLUMN無論如何您都必須稍後使用。

當我在上面提到“非常大”時,它是關於用於列定義的不同數據類型的對齊和填充。例如,具有列(按此順序)的表的一行(smallint, integer, smallint)將比具有(smallint, smallint, integer). 這僅在百萬行的 10 秒錶(在體面的硬體上可能是 100 秒)或表有很多列很多行時才開始產生影響。Erwin Brandstetter 的出色回答中對此有更多了解。

在 11 之前的 Postgres 版本中添加新列時,請注意ALTER TABLE ... ADD COLUMN ... NOT NULL DEFAULT .... 由於ALTER TABLE ... ADD COLUMN需要一個防止並發會話訪問表的重鎖,因此您必須使事務盡可能短。如果您設法做到這一點,那麼添加新列對其他程序的性能來說幾乎不會引起注意。

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