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 がテーブルのフル スキャンを実行して、新しい列の追加がデータ整合性に違反していないことを確認するためです。 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 用の新しい累積的な更新プログラムには、以前の累積的な更新プログラムに含まれていたすべての修正プログラムとすべてのセキュリティ修正プログラムが含まれています。 SQL Server の最新の累積的な更新プログラムを確認してください。

      

追加情報

  • startup パラメーターを使用して、トレース フラグ 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 製品の問題であることを確認しました。