8 KB を超える場合の行オーバーフロー データ

1 つのテーブルには、行ごとに最大 8,060 バイトのデータを格納できます。SQL Server 2008 の varchar 型、nvarchar 型、varbinary 型、sql_variant 型、または CLR ユーザー定義型の列を含むテーブルでは、この制限が緩和されます。これらの列の長さは、単独の場合は引き続き 8,000 バイトに制限されますが、組み合わせた場合は 8,060 バイトの制限を超えることができます。このことは、varchar 型、nvarchar 型、varbinary 型、sql_variant 型、または CLR ユーザー定義型の列の作成時および変更時に適用されます。また、データの更新時または挿入時にも適用されます。

注意

この制限は、varchar(max) 型、nvarchar(max) 型、varbinary(max) 型、text 型、image 型、または xml 型の列には適用されません。これらの列の格納形式の詳細については、「大きな値のデータ型の使用」、「text 型データと image 型データの使用」、および「XML データの使用」を参照してください。

行のオーバーフローに関する注意点

varchar 型、nvarchar 型、varbinary 型、sql_variant 型、または CLR ユーザー定義型の列の組み合わせが 1 行あたり 8,060 バイトを超える場合は、次のことを考慮してください。

  • SQL Server には依然として 1 ページあたり 8 KB の制限があるので、行のサイズが 8,060 バイトの制限を超えると、パフォーマンスが影響を受ける場合があります。varchar 型、nvarchar 型、varbinary 型、sql_variant 型、または CLR ユーザー定義型の列を組み合わせた長さがこの制限を超えると、SQL Server データベース エンジンにより、最大幅のレコード列が ROW_OVERFLOW_DATA アロケーション ユニット内の別のページに移動されます。元のページには、24 バイトのポインタが維持されます。更新操作に基づいてレコードが大きくなると、大きなレコードが別のページに動的に移動されます。レコードが短くなる更新操作が発生すると、レコードが IN_ROW_DATA アロケーション ユニット内の元のページに移動することがあります。また、行オーバーフロー データを含む大きなレコードで、クエリを実行したり並べ替えや結合などの他の選択操作を実行すると、処理に時間がかかります。これは、これらのレコードが非同期にではなく同期的に処理されるためです。

    したがって、複数の varchar 型、nvarchar 型、varbinary 型、sql_variant 型、または CLR ユーザー定義型の列を含むテーブルをデザインするときは、オーバーフローする可能性が高い行の割合と、このオーバーフロー データへのクエリが実行される頻度を考慮します。行オーバーフロー データの多くの行にクエリが頻繁に実行される可能性が高い場合は、いくつかの列を別のテーブルに移動して、テーブルのサイズを正規化することを検討します。これにより、非同期結合操作でクエリを行えるようになります。

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

  • char 型や nchar 型のデータなど、他のデータ型の列の合計は、8,060 バイトの行の制限の範囲内に収まる必要があります。ラージ オブジェクト データにも、8,060 バイトの行の制限は適用されません。

  • クラスタ化インデックスのインデックス キーには、ROW_OVERFLOW_DATA アロケーション ユニットに既存のデータを持つ varchar 型の列を含めることはできません。クラスタ化インデックスが varchar 型の列に作成され、既存のデータが IN_ROW_DATA アロケーション ユニットにある場合に、データを行外に押し出すような挿入処理や更新処理をその列に対して行うと失敗します。アロケーション ユニットの詳細については、「テーブルとインデックスの編成」を参照してください。

  • 行オーバーフロー データを含む列を、非クラスタ化インデックスのキー列または非キー列として含めることができます。

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

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