Postgresql
我可以根據 Postgres 中的實時表修改列的數據類型嗎?
我有一個稀疏矩陣表,其中每個屬性都是
citext
. 針對一些欄位建構了一些索引。我想將這些列改回
varchar
.
- 我可以針對實時生產表執行此操作,還是需要關閉數據庫?
- 之後是否需要重建索引?
- 這會節省空間嗎?
- 這會給我們帶來任何形式的性能提升(如果這些列被大量索引)?
- 我可以針對實時生產表執行此操作,還是需要關閉數據庫?
**是的。**你可以對著一張活桌來做。甚至會非常快,因為
citext
並且varchar
是二進制強制的,因此不需要表重寫(自 Postgres 9.1 起)。但這仍然會獲取表上的
ACCESS EXCLUSIVE
鎖,這會使表上的任何並發訪問等待,並可能失敗。如果有任何索引涉及該列,則仍必須(自動)重建這些索引,這可能需要更長的時間。並且任何依賴對象(如使用該列的視圖)都是障礙,需要在更改之前刪除(稍後再添加)。
有關的:
- 之後是否需要重建索引?
不。以任何方式涉及該列的索引都必須重建,但這會自動發生。往上看。手冊:
通過重新解析最初提供的表達式,涉及該列的索引和簡單表約束將自動轉換為使用新的列類型。
- 這會節省空間嗎?
不,二進制強制意味著磁碟和 RAM 上的空間相同。對於現在處於原始狀態的重建索引可能會產生一次性影響 - 特別是如果這些索引臃腫。
- 任何形式的性能提升?
不見得。取決於完整的圖片。
citext
可能有用也可能沒用。我不建議citext
在混合體驗之後。我寧願使用表達式索引。或者考慮Postgres 12 或更高版本中的非確定性排序規則。一般來說,
citext
操作符在任何地方都比普通的text
/varchar
操作符慢一點。(他們必須做更多的工作。)重寫相關索引的可能一次性效果也可以實現REINDEX
。有關的: