索引鍵的大小上限
當您設計包含多個索引鍵資料行或大型資料行的索引時,需計算索引鍵的大小以確保您不會超過最大的索引鍵大小。SQL Server 2005 為所有索引鍵資料行的總大小保留 900 個位元組的上限。這不包括非叢集索引定義中包含的無索引鍵資料行。
計算索引鍵的大小
若要計算索引鍵的大小,請依照下列步驟:
顯示索引所根據的資料表資料行屬性。您可以使用 sys.columns 目錄檢視來進行。
將每一個要定義在索引鍵中的資料行長度加總。
例如,下列陳述式對Person.Address
資料表中指定的資料行彙總sys.columns
目錄檢視的max
_length
資料行。USE AdventureWorks; 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。如果總長度小於 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 2005 Database Engine」在計算索引鍵資料行的數目或索引鍵資料行的總大小時,不會考慮無索引鍵的資料行。在有內含資料行的非叢集索引中,索引鍵資料行的總大小限制為 900 個位元組。所有無索引鍵資料行的總大小只會受限於 INCLUDE 子句指定的資料行大小;例如 varchar(max) 資料行限制為 2 GB。INCLUDE 子句中的資料行可以是 text、ntext 和 image 以外的所有資料類型。
請參閱
概念
一般索引設計指導方針
具有內含資料行的索引
索引設計基本概念
其他資源
CREATE INDEX (Transact-SQL)
sys.columns (Transact-SQL)
sys.indexes (Transact-SQL)
sys.index_columns (Transact-SQL)