Sql-Server

SQL Server - 更改表與刪除和創建

  • July 21, 2015

我們的數據庫是 SQL Server 2008 R2。我們有一些表有一些我想切換到 datetime2 或 bigint 的 varchar(500) 列。我可以保證要切換的列中的所有數據對於正確的類型都是有效的。列更改確實會影響索引,但不會影響鍵。

在與同事討論時,我們得出了兩種解決問題的方法。這兩個都將通過 T-Sql 腳本完成。

  1. 通過 select into 創建一個臨時表,刪除舊表並使用正確的數據類型重新創建表。重新創建索引。
  2. 通過更改目前表/數據類型 ALTER TABLE x ALTER COLUMN Y datetime2,然後重建或重新創建索引。

因為我相信數據會乾淨利落地轉換,所以我傾向於#2。我的同事和一個 DBA 朋友更喜歡 #1,但我的同事不記得他們為什麼要這樣訓練他。DBA 朋友正在度假,所以我沒有問他為什麼。

有人可以就他們認為哪個選項更好以及為什麼提供見解嗎?最終這是我的決定,我想知道為什麼 #1 比 #2 更受歡迎?

我最近在我的組織中做了這個,我們想要處理一個有十億多行的表。

這個想法的所有功勞都歸功於 Aaron Bertrand,並且來自他的部落格文章Trick Shots : Schema Switch-A-Roo

在一張小桌子上測試下面的過程,並在 PROD 中進行之前讓自己感到舒服。

  1. 創建 2 個模式fakeshadow獲得授權dbo
  2. shadow在架構中創建一個包含您想要的列和數據類型的表,例如create table shadow.Correct_Table ...
  3. 插入數據並創建原始表在shadow模式表中的所有索引。
  4. 通過這種方式,您可以獲得具有數據和索引的相同表副本,但它們位於不同的模式中(邏輯上分開)。
  5. shadow完成後,使用模式更新表上的統計資訊。
  6. 切換模式(這是元數據操作,速度極快)
--- ALTER SCHEMA TargetSchema TRANSFER SourceSchema.TableName; 

BEGIN TRANSACTION;

 ALTER SCHEMA fake TRANSFER     dbo.original_table;
 ALTER SCHEMA dbo  TRANSFER  shadow.Correct_Table;

COMMIT TRANSACTION;

ALTER SCHEMA shadow TRANSFER fake.Lookup;
  1. 做最後檢查,看看一切是否按計劃進行。你應該做一個select count(1) from dbo.Correct_table
  2. 確認第 7 步並且您感到滿意後,將shadow.tableshadow模式和fake模式刪除為清理。

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