在更新或插入的同時添加可為空的列
在 SQL Server 中,當向具有數百萬行的實時 SQL Server 數據庫添加允許空值的列時,如果插入或更新與 DDL 更新同時發生,會發生什麼情況?
例如:
ALTER TABLE MyTable ADD MyColumn varchar(255) NULL;
參考ALTER TABLE的文件(突出顯示我的),
ALTER TABLE 中指定的更改會立即實施。如果更改需要修改表中的行,則 ALTER TABLE 會更新這些行。**ALTER TABLE 在表上獲取模式修改 (SCH-M) 鎖,以確保在更改期間沒有其他連接甚至引用表的元數據,除了最後需要非常短的 SCH-M 鎖的線上索引操作。**在 ALTER TABLE…SWITCH 操作中,在源表和目標表上都獲得了鎖。對錶所做的修改會被記錄並完全恢復。影響非常大表中所有行的更改(例如刪除列或在某些版本的 SQL Server 上添加具有預設值的 NOT NULL 列)可能需要很長時間才能完成並生成許多日誌記錄。這些 ALTER TABLE 語句的執行應與影響許多行的任何 INSERT、UPDATE 或 DELETE 語句一樣小心。
此外,Paul Randal 在圍繞向表添加列的誤解中提供了一些關於添加列時會發生什麼(以及操作可能需要多長時間)的好資訊。總結一些要點:
新列可以為空,預設為 NULL。表的元數據記錄了新列存在但可能不在記錄中的事實。這就是為什麼空點陣圖還具有該特定記錄中列數的計數。SQL Server 可以確定記錄中是否存在列。所以——這不是一個數據大小操作——當添加新列時,現有的表記錄不會更新。僅當為某些其他操作更新記錄時才會更新記錄。
新列可以為空,預設為非 NULL。這取決於您使用的 SQL Server 版本:
- 在 SQL Server 2012 之前:這是一個數據大小操作。非 NULL 預設值會在添加列時強制更新所有現有記錄,因此也會更新空點陣圖。
- SQL Server 2012 及更高版本:與 NULL 預設可空列的行為相同(即僅元數據操作)
新列不可為空(顯然具有非 NULL 預設值)。這是一個數據大小的操作。
對於表中的所有記錄,整列將為空
開始翻譯
ALTER TABLE MyTable ADD MyColumn varchar(255) NULL;
從 MyTable 中選擇 MyColumn,*
回滾
執行此命令並檢查會發生什麼!!!
回滾中的程式碼會臨時更新,因此您也可以通過修改程式碼來檢查