web-dev-qa-db-ja.com

varchar(max)フィールドを含むSQL Server 2012の最大行サイズ

列タイプがnvarchar(max)のテーブルを作成しました。私の理解では、2GBをサポートできます。ただし、挿入すると、まだこのエラーが表示されます。

許容最大行サイズ8060より大きいサイズ8061の行は作成できません。

必要なデータベースのグローバル設定はありますか、それとも他の制限がありますか?テーブルごとのvarchar(max)フィールドの数に制限はありますか?

14
taylormade201

SQLサーバーはデータを保存するためにページを使用します。ページサイズは8kbです。

SQLサーバーのレコードサイズ(行サイズ)は8060バイトを超えることはできません。

データが8060バイトに収まらない場合、参照ポインターが使用されます。 varchar、nvarchar、varbinary、sql_variant、またはCLRユーザー定義型列の組み合わせがこの制限を超えると、SQL Serverデータベースエンジンが移動します元のページで24バイトポインターを維持しながら、ROW_OVERFLOW_DATAアロケーションユニット内の別のページまでの幅が最大のレコード列。

更新操作に基づいてレコードが長くなると、大きなレコードを別のページに移動することが動的に行われます。レコードを短くする更新操作により、レコードがIN_ROW_DATAアロケーションユニットの元のページに戻される場合があります。

また、行オーバーフローデータを含む大きなレコードの並べ替えや結合などの他の選択操作をクエリして実行すると、これらのレコードが非同期ではなく同期的に処理されるため、処理時間が遅くなります。

スパース列の使用は8,018バイトですであるテーブルのレコードサイズ制限。変換されたデータと既存のレコードデータの合計が8,018バイトを超えると、MSSQLSERVER ERROR 576が返されます。列がスパース型と非スパース型の間で変換されると、データベースエンジンは現在のレコードデータのコピーを保持します。これにより、レコードに必要なストレージが一時的に2倍になります。 。

行オーバーフローデータを含む可能性のあるテーブルまたはインデックスに関する情報を取得するには、sys.dm_db_index_physical_stats動的管理関数を使用します。

10

SQL Serverのドキュメントから:

個々の列の長さは、varchar、nvarchar、varbinary、sql_variant、およびCLRユーザー定義型列の場合、8,000バイトの制限内に収まる必要があります。 それらを組み合わせた長さのみが、テーブルの8,060バイトの行制限を超えることができます。

charおよびncharデータを含む他のデータ型列の合計は、8,060バイトの行制限内に収まる必要があります。ラージオブジェクトデータも、8,060バイトの行制限から除外されます。

詳細はこちら: https://technet.Microsoft.com/en-us/library/ms186981%28v=sql.105%29.aspx

3
Max

これは、StackOverflowの以前のスレッドからのものです。

許容最大値8060より大きいサイズ8937の行は作成できません

このエラーは、SQL Serverに8KB(1ページのサイズ)を超える行を含めることができないために発生します。行をページにまたがることができないため、SQL Serverの基本的な制限です[...]

SQLサーバーではテーブルを作成できますが、実際に複数のページにまたがるデータを挿入しようとすると、上記のエラーが発生します。もちろん、これは完全には加算されません。なぜなら、上記が真実である場合、単一のVARCHAR(8000)列がテーブルの行を埋めるからです! (これはかつてそうでした)。 SQL Server 2005では、行の特定のデータを別のページに格納できるようにし、代わりに24ビットポインターを残して、この制限を回避しました。

テーブルを1つ以上の関連するテーブルに正規化することをお勧めします。

0
sqlgrl