症狀
假設你在 Microsoft SQL Server 2012 或 SQL Server 2014 中新增欄位。 當資料列大小接近最大允許大小 8,060 位元組時,加法操作可能會花費較長時間。
原因
問題發生在當資料列總大小接近最大允許資料時,SQL Server 會對資料表進行全面掃描,以確保新增欄位不會違反資料完整性。 2012 SQL Server 之前的版本不進行此檢查,這使得 DDL) (資料定義語言運行更快。 然而,若列大小超過允許大小,這種行為會導致後續操作失敗,例如資料列更新或縮小。
解決方式
這次累積更新引入了新的追蹤旗標 647,用於向下相容行為。
此問題首次在 SQL Server 的累積更新中得到修正。
2014 SQL Server /en-us/help/3011055 累積更新 5
2012 SQL Server SP1 累積更新 12 /en-us/help/2991533
2012 SQL Server SP2 累積更新 2 /en-us/help/2983175
關於 SQL Server 的累積更新
每次新的 SQL Server 累積更新都包含了之前累積更新中包含的所有熱修補與安全修補。 請查看 SQL Server 的最新累積更新:
更多資訊
你可以用啟動參數開啟追蹤旗標 647。 詳情請參閱 資料庫引擎服務啟動選項。
你可以執行以下查詢 (請將資料表名稱>替換<成你的實際資料表名稱,) 在生產系統操作前測試該特定資料表,並規劃此問題的影響。 若結果超過 8,060,您的表格將面臨此問題。 另外,如果你有欄位被刪除,必須用重建選項修改表格。 重建資料表可以讓查詢回傳正確的結果。
select 1+1+2 + 2 + (case when sum (case when leaf_offset < 0 then 1 else 0 end) > 0 then 2 else 0 end) + ( (count (*) + 7)/8 ) + count (case when leaf_offset < 0 then 1 else null end) * 2 + sum( case when max_length=-1 then 24 else max_length end) from sys.system_internals_partition_columns col join sys.partitions par on col.partition_id = par.partition_id where object_id = object_id ('<table name>') and index_id in (0,1) and partition_number =1當應用程式經常新增欄位時,可以考慮新增可變長度欄位或稀疏欄位。 即使所有欄位總大小超過 8,060 位元組,這仍是僅中繼資料操作。
狀態
Microsoft 已確認這是「適用對象」一節中列出的 Microsoft 產品中的問題。