Postgresql

我可以根據 Postgres 中的實時表修改列的數據類型嗎?

  • January 7, 2020

我有一個稀疏矩陣表,其中每個屬性都是citext. 針對一些欄位建構了一些索引。

我想將這些列改回varchar.

  • 我可以針對實時生產表執行此操作,還是需要關閉數據庫?
  • 之後是否需要重建索引?
  • 這會節省空間嗎?
  • 這會給我們帶來任何形式的性能提升(如果這些列被大量索引)?
  • 我可以針對實時生產表執行此操作,還是需要關閉數據庫?

**是的。**你可以對著一張活桌來做。甚至會非常快,因為citext並且varchar二進制強制的,因此不需要表重寫(自 Postgres 9.1 起)。

但這仍然會獲取表上的ACCESS EXCLUSIVE,這會使表上的任何並發訪問等待,並可能失敗。如果有任何索引涉及該列,則仍必須(自動)重建這些索引,這可能需要更長的時間。

並且任何依賴對象(如使用該列的視圖)都是障礙,需要在更改之前刪除(稍後再添加)。

有關的:

  • 之後是否需要重建索引?

。以任何方式涉及該列的索引都必須重建,但這會自動發生。往上看。手冊:

通過重新解析最初提供的表達式,涉及該列的索引和簡單表約束將自動轉換為使用新的列類型。

  • 這會節省空間嗎?

,二進制強制意味著磁碟和 RAM 上的空間相同。對於現在處於原始狀態的重建索引可能會產生一次性影響 - 特別是如果這些索引臃腫。

  • 任何形式的性能提升?

不見得。取決於完整的圖片。citext可能有用也可能沒用。我不建議citext在混合體驗之後。我寧願使用表達式索引。或者考慮Postgres 12 或更高版本中的非確定性排序規則。

一般來說,citext操作符在任何地方都比普通的text/varchar操作符慢一點。(他們必須做更多的工作。)重寫相關索引的可能一次性效果也可以實現REINDEX

有關的:

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