現象
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 の最新の累積的な更新プログラムを確認してください。
- SQL Server 2014 の最新の累積的な更新プログラム
- SQL Server 2012 SP1 の最新の累積的な更新プログラム
- SQL Server 2012 SP2 の最新の累積的な更新プログラム
追加情報
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 製品の問題であることを確認しました。