徵狀
假設您將資料行新增至 Microsoft SQL Server 2012 或 SQL Server 2014 中的資料表。 當列的大小接近8060個位元組的允許大小上限時,新增作業可能需要花很長的時間。
原因
發生這個問題的原因是,當列的總大小接近允許的最大列大小時,SQL Server 會對資料表進行完整的掃描,以確保新增的欄不會違反資料完整性。 SQL Server 2012 之前的版本不會執行這項檢查,這會讓資料定義語言(DDL)執行得更快。 不過,如果列大小超過允許的大小,此行為就會導致後續操作(例如列更新或收縮)失敗。
解決方案
累積更新為向後相容性行為引入了新的追蹤標記647。此問題最初是在 SQL Server 的後續累積更新中修正。
SQL Server 2014 累積更新5 /en-us/help/3011055
SQL Server 2012 SP1 累計更新12 /en-us/help/2991533
SQL Server 2012 SP2 累積更新2 /en-us/help/2983175
每個新的 SQL Server 累計更新都包含所有的修正程式,以及前一個累積更新中所包含的所有安全性修正程式。 查看 SQL Server 的最新累計更新:
其他相關資訊
-
您可以使用 [啟動] 參數開啟 trace 標誌647。 如需詳細資訊,請參閱 資料庫引擎服務啟動選項。
-
您可以執行下列查詢(請將 <資料表名稱> 替換為實際的資料表名稱),在生產系統上測試特定資料表,然後規劃此問題的效果。 如果結果大於8060,您的表格會受此問題的制約。 此外,如果您已放下欄,您必須使用重建選項變更資料表。 重建資料表可以讓查詢傳回正確的結果。
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
-
您可以考慮在您的應用程式經常將新資料行新增至資料表時,新增可變長度欄或稀疏列。 即使所有欄的總大小超過8060個位元組,也是僅限中繼資料的運算。
狀態
Microsoft 已確認本篇文章<適用於>一節所列之 Microsoft 產品確實有上述問題。