現象
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 の最新の累積的な更新プログラムを確認します。
詳細情報
-
トレースフラグ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バイトを超える場合でも、メタデータのみの操作です。
状態
マイクロソフトでは、この問題をこの資料の対象製品として記載されているマイクロソフト製品の問題として認識しています。