索引鍵的大小上限

當您設計包含多個索引鍵資料行或大型資料行的索引時,需計算索引鍵的大小以確保您不會超過最大的索引鍵大小。SQL Server 為所有索引鍵資料行的總大小保留 900 個位元組的上限。這不包括非叢集索引定義中包含的非索引鍵資料行。

計算索引鍵的大小

若要計算索引鍵的大小,請依照下列步驟:

  1. 顯示索引所根據的資料表資料行屬性。您可以使用 sys.columns 目錄檢視來進行。

  2. 將每一個要定義在索引鍵中的資料行長度加總。

    例如,下列陳述式對 Person.Address 資料表中指定的資料行彙總 sys.columns 目錄檢視的 max_length 資料行。

    USE AdventureWorks2008R2;
    GO
    SELECT SUM(max_length)AS TotalIndexKeySize
    FROM sys.columns
    WHERE name IN (N'AddressLine1', N'AddressLine2', N'City', N'StateProvinceID', N'PostalCode')
    AND object_id = OBJECT_ID(N'Person.Address');
    

    [!附註]

    如果資料表資料行是 Unicode 資料類型,如 nchar 或 nvarchar,則顯示的資料行長度是資料行的儲存體長度。這會是 CREATE TABLE 陳述式中指定字元的兩倍。在先前的範例中,City 是定義為 nvarchar(30) 資料類型,所以資料行的儲存體長度是 60。

  3. 如果總長度小於 900 位元組,資料行可以做為索引鍵資料行。如果總長度超過 900 個位元組,請檢視下列資訊以了解其他選項和考量。

    CREATE INDEX 陳述式使用下列演算法計算索引鍵大小:

    • 如果所有固定索引鍵資料行的大小加上 CREATE INDEX 陳述式中指定之所有變動索引鍵資料行的大小上限小於 900 個位元組,CREATE INDEX 陳述式會順利完成,不產生警告或錯誤。

    • 如果所有固定索引鍵資料行的大小加上所有變動索引鍵資料行的大小上限超過 900,但所有固定的索引鍵資料行大小加上變動索引鍵資料行的最小值小於 900,CREATE INDEX 陳述式會成功,並傳回警告,說明如果隨後 INSERT 或 UPDATE 陳述式指定的值若產生大於 900 個位元組的索引鍵值,該陳述式就會失敗。如果資料表中現有資料列的值會產生大於 900 個位元組的索引鍵,CREATE INDEX 陳述式就會失敗。後續的 INSERT 或 UPDATE 陳述式若指定會產生超過 900 個位元組的索引鍵,該陳述式就會失敗。

    • 如果所有固定索引鍵資料行的大小加上 CREATE INDEX 陳述式中指定的所有變動索引鍵資料行的大小下限超過 900 個位元組,CREATE INDEX 陳述式會失敗。

    下表摘要建立索引時符合或超過最大索引鍵大小限制的結果。

變動長度資料行的大小下限 + 固定長度資料行的大小

變動長度資料行的大小上限 + 固定長度資料行的大小

現有資料列的索引鍵資料行長度「總和」的「最大值」 *

建立索引

訊息類型

由於索引鍵值過大造成 INSERT、UPDATE 執行階段錯誤

> 900 位元組

不相關

不相關

錯誤

沒有索引,無法產生錯誤。

<= 900 位元組

<= 900 位元組

不相關

否。

<= 900 位元組

> 900 位元組

<= 900 位元組

警告

僅在所有索引資料行目前長度總和大於 900 位元組時才會發生。

<= 900 位元組

> 900 位元組

> 900 位元組

錯誤

沒有索引,無法產生錯誤。

* 執行 CREATE INDEX 陳述式時,資料表中任何資料列的索引鍵值總長度都不得超過 900 個位元組。

使用內含資料行避開大小限制

您可以在非叢集索引中包含無索引鍵的資料行,以避開目前索引大小為最大 16 個索引鍵資料行以及最大 900 個位元組的索引鍵大小之限制。「SQL Server Database Engine」在計算索引鍵資料行的數目或索引鍵資料行的總大小時,不會考慮無索引鍵的資料行。在有內含資料行的非叢集索引中,索引鍵資料行的總大小限制為 900 個位元組。所有非索引鍵之索引資料行的總大小只會受限於 INCLUDE 子句指定的資料行大小;例如 varchar(max) 資料行限制為 2 GB。INCLUDE 子句中的資料行可以是 text、ntext 和 image 以外的所有資料類型。

[!附註]

分割資料表時,如果資料分割索引鍵資料行原本不存在非唯一的叢集索引中,Database Engine 就會將它們加入至索引。在非唯一的叢集索引中,索引資料行 (不計算包含的資料行) 再加上任何加入之資料分割資料行的組合大小不得超過 1800 個位元組。