超過 8 KB 的資料列溢位資料

資料表的每個資料列最多可以包含 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 使用者定義型別資料行結合在一起,因而超過每個資料列 8,060 個位元組的限制時,請考慮下列情況:

  • 超過 8,060 個位元組的資料列大小限制可能會影響效能,因為「SQL Server」仍保持每頁 8 KB 的限制。當 varchar、nvarchar、varbinary、sql_variant 或 CLR 使用者定義型別資料行合起來超過這項限制時,「SQL Server Database Engine」會將具有最大寬度的記錄資料行移到 ROW_OVERFLOW_DATA 配置單位中的另一個分頁,同時在原始分頁上保持 24 個位元組的指標。當記錄因更新作業而加長時,這些大型記錄會動態地移到另一個分頁上。當更新作業將記錄縮短時,則會造成這些記錄移回 IN_ROW_DATA 配置單位中的原始分頁。此外,查詢與執行其他選取作業 (例如在包含資料列溢位資料的大型記錄上執行排序或聯結) 時,處理速度將會變慢,這是因為這些記錄會以同步而不是非同步的方式來處理。

    因此,當您設計具有多個 varchar、nvarchar、varbinary、sql_variant 或 CLR 使用者定義型別資料行的資料表時,請考慮可能會「溢位」的資料列百分比,以及可能會查詢此溢位資料的頻率。如果可能會經常在許多資料列溢位資料的資料列上執行查詢,請考慮將資料表正規化,以便將一些資料行移到另一個資料表。然後便可以用非同步 JOIN 作業進行查詢。

  • 對於 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。在疏鬆與非疏鬆類型之間轉換資料行時,Database Engine 就會保留一份目前記錄資料的副本。這樣做會暫時將記錄所需的儲存體加倍。.

  • 若要取得可能包含資料列溢位資料之資料表或索引的相關資訊,請使用 sys.dm_db_index_physical_stats 動態管理函數。