Sql-Server
SQL Server - 更改表與刪除和創建
我們的數據庫是 SQL Server 2008 R2。我們有一些表有一些我想切換到 datetime2 或 bigint 的 varchar(500) 列。我可以保證要切換的列中的所有數據對於正確的類型都是有效的。列更改確實會影響索引,但不會影響鍵。
在與同事討論時,我們得出了兩種解決問題的方法。這兩個都將通過 T-Sql 腳本完成。
- 通過 select into 創建一個臨時表,刪除舊表並使用正確的數據類型重新創建表。重新創建索引。
- 通過更改目前表/數據類型
ALTER TABLE x ALTER COLUMN Y datetime2
,然後重建或重新創建索引。因為我相信數據會乾淨利落地轉換,所以我傾向於#2。我的同事和一個 DBA 朋友更喜歡 #1,但我的同事不記得他們為什麼要這樣訓練他。DBA 朋友正在度假,所以我沒有問他為什麼。
有人可以就他們認為哪個選項更好以及為什麼提供見解嗎?最終這是我的決定,我想知道為什麼 #1 比 #2 更受歡迎?
我最近在我的組織中做了這個,我們想要處理一個有十億多行的表。
這個想法的所有功勞都歸功於 Aaron Bertrand,並且來自他的部落格文章Trick Shots : Schema Switch-A-Roo
在一張小桌子上測試下面的過程,並在 PROD 中進行之前讓自己感到舒服。
- 創建 2 個模式
fake
並shadow
獲得授權dbo
。shadow
在架構中創建一個包含您想要的列和數據類型的表,例如create table shadow.Correct_Table ...
- 插入數據並創建原始表在
shadow
模式表中的所有索引。- 通過這種方式,您可以獲得具有數據和索引的相同表副本,但它們位於不同的模式中(邏輯上分開)。
shadow
完成後,使用模式更新表上的統計資訊。- 切換模式(這是元數據操作,速度極快)
--- 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;
- 做最後檢查,看看一切是否按計劃進行。你應該做一個
select count(1) from dbo.Correct_table
- 確認第 7 步並且您感到滿意後,將
shadow.table
、shadow
模式和fake
模式刪除為清理。