Postgresql
在大表上更改日期列以時間戳的最佳方法?
我必須在一個有 10 億條記錄的大表上找到
ALTER
一個date
欄位。timestamp
我正在使用 Postgres 9.5。我了解到,當我們使用 alter query 時,會獲得一個沉重的“訪問獨占”鎖,這會將表中的所有其他內容都關閉。
我們如何才能有效地實現這一目標?
如何有效地做到這一點,以及如何在不阻礙其他人的情況下做到這一點是截然相反的目標。有效的方法是安排一個停機時間視窗來執行此操作。
如果做不到,那麼:
- 添加所需類型的新列,預設值為 NULL。
- 更改所有更改舊列或插入新行的程式碼,以確保它們也正確填充新列(但確保它們不依賴於已經正確的新值——它們只是使其正確)
- 創建索引以有效查找新列仍為 NULL 的行
- 編寫一個腳本來更新具有新列的 NULL 值的行,以根據舊列的值將它們設置為正確。在盡可能大的塊中執行此操作,因為塊中的第一行將在塊處理期間被鎖定。
- 一旦完成並驗證了所有塊,將所有程式碼更改為依賴新列而不是舊列。
- 更改所有程式碼以停止嘗試維護舊列
- 刪除舊列
- 刪除支持查找新列的仍然為空值的索引(除非它仍然有用)
您好但是我不知道數據和表的大小有多大。但在我看來。
您也可以在您的測試環境中執行此操作。
- 為網站安排停機時間很好。
database
以令人滿意的測量值對或特定的完整備份,table
例如不要忘記製作primary
,foreign
也indexes
不要忘記procedure
,functions
備份也只是確保一切正常。- 刪除/重命名
table
,然後使用create
該New table
特定列的特定時間戳設置。- 將數據轉儲回表中。在此步驟中,您只需在需要時檢查或使用日期到時間戳的轉換功能
- 好處是您不必更改應用程序端程式碼。直到您在 或 中投射或詢問特定日期格式
**select query**
的特定 點**insert query**
。不要忘記indexes
在列上進行以獲得更好的性能。- 如果一切正常,那麼您可以刪除/刪除該重命名的表。
我希望它會給一些想法。