Applies ToSQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use) SQL Server 2012 Developer SQL Server 2012 Enterprise SQL Server 2012 Standard

徵狀

假設您將資料行新增至 Microsoft SQL Server 2012 或 SQL Server 2014 中的資料表。 當列的大小接近8060個位元組的允許大小上限時,新增作業可能需要花很長的時間。

原因

發生這個問題的原因是,當列的總大小接近允許的最大列大小時,SQL Server 會對資料表進行完整的掃描,以確保新增的欄不會違反資料完整性。 SQL Server 2012 之前的版本不會執行這項檢查,這會讓資料定義語言(DDL)執行得更快。 不過,如果列大小超過允許的大小,此行為就會導致後續操作(例如列更新或收縮)失敗。

每個新的 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 產品確實有上述問題。

Need more help?

Want more options?

探索訂閱權益、瀏覽訓練課程、瞭解如何保護您的裝置等等。

社群可協助您詢問並回答問題、提供意見反應,以及聆聽來自具有豐富知識的專家意見。