KB2986423 - 修正:當資料列大小超過最大允許大小時,新增欄位會花費很長時間

套用到
SQL 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 中新增欄位。 當資料列大小接近最大允許大小 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 產品中的問題。