Postgresql

在大表上更改日期列以時間戳的最佳方法?

  • May 30, 2018

我必須在一個有 10 億條記錄的大表上找到ALTER一個date欄位。timestamp

我正在使用 Postgres 9.5。我了解到,當我們使用 alter query 時,會獲得一個沉重的“訪問獨占”鎖,這會將表中的所有其他內容都關閉。

我們如何才能有效地實現這一目標?

如何有效地做到這一點,以及如何在不阻礙其他人的情況下做到這一點是截然相反的目標。有效的方法是安排一個停機時間視窗來執行此操作。

如果做不到,那麼:

  • 添加所需類型的新列,預設值為 NULL。
  • 更改所有更改舊列或插入新行的程式碼,以確保它們也正確填充新列(但確保它們不依賴於已經正確的新值——它們只是使其正確)
  • 創建索引以有效查找新列仍為 NULL 的行
  • 編寫一個腳本來更新具有新列的 NULL 值的行,以根據舊列的值將它們設置為正確。在盡可能大的塊中執行此操作,因為塊中的第一行將在塊處理期間被鎖定。
  • 一旦完成並驗證了所有塊,將所有程式碼更改為依賴新列而不是舊列。
  • 更改所有程式碼以停止嘗試維護舊列
  • 刪除舊列
  • 刪除支持查找新列的仍然為空值的索引(除非它仍然有用)

您好但是我不知道數據和表的大小有多大。但在我看來。

您也可以在您的測試環境中執行此操作。

  1. 為網站安排停機時間很好。
  2. database以令人滿意的測量值對或特定的完整備份,table例如不要忘記製作primaryforeignindexes不要忘記procedurefunctions備份也只是確保一切正常。
  3. 刪除/重命名table,然後使用createNew table特定列的特定時間戳設置。
  4. 將數據轉儲回表中。在此步驟中,您只需在需要時檢查或使用日期到時間戳的轉換功能
  5. 好處是您不必更改應用程序端程式碼。直到您在 或 中投射詢問特定日期格式**select query**的特定 點**insert query**。不要忘記indexes在列上進行以獲得更好的性能。
  6. 如果一切正常,那麼您可以刪除/刪除該重命名的表。

我希望它會給一些想法。

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