web-dev-qa-db-ja.com

文字長の900バイトのインデックスサイズ制限

SQL Server 2012が持つ900バイトのインデックス制限の合計文字数制限はいくらですか。 varchar(2000)を持つ列を作成しましたが、SQL Serverが制限している900バイトを超えていると思いますか? 900バイトのインデックス列に収まる最大のvarchar(?)は何ですか?

38
iefpw

varchar のストレージサイズは、入力されたデータの実際の長さ+ 2バイトです。列自体に2バイトのオーバーヘッドがありますが、 900バイト varchar値までをインデックス付きの列に入れることができます。

実際には、createサイズ900バイトを超える列にインデックスを作成できますが、実際にinsert900バイトより大きいもの:

create table test (
    col varchar(1000)
);
create index test_index on test (col);
-- Warning! The maximum key length is 900 bytes. The index 'test_index' has maximum length of 1000 bytes. For some combination of large values, the insert/update operation will fail.
insert into test select cast(replicate('x', 899) as varchar(1000)); -- Success
insert into test select cast(replicate('y', 900) as varchar(1000)); -- Success
insert into test select cast(replicate('z', 901) as varchar(1000)); -- Fail
-- Msg 1946, Level 16, State 3, Line 8
-- Operation failed. The index entry of length 901 bytes for the index 'test_index' exceeds the maximum length of 900 bytes.

この例が示すように、900バイトの制限には特定のインデックスキーのすべての列が含まれることに注意してください。

create table test (
      col varchar(1000)
    , otherCol bit -- This column will take a byte out of the index below, pun intended
);
create index test_index on test (col, otherCol);
insert into test select cast(replicate('x', 899) as varchar(1000)), 0; -- Success
insert into test select cast(replicate('y', 900) as varchar(1000)), 0; -- Fail
insert into test select cast(replicate('z', 901) as varchar(1000)), 0; -- Fail

通常、インデックスキーには大きすぎるこれらの列については、インデックス内で include を使用することで、インデックス付けの利点を得ることができます。

49
Tim Lehner

関連するメモでは、幅の広い列のインデックスを取得するために試すことができる別のオプションの概要が http://www.brentozar.com/archive/2013/05/indexing-wide-keys-in -sql-server / ハッシュ列がテーブルに追加され、インデックスが作成され、クエリで使用されます。

9
lmingle

SQLServer 2016の場合、インデックスキーサイズは1700バイトに増加しました。 データベースエンジンの新機能-SQL Server 2016

NONCLUSTEREDインデックスの最大インデックスキーサイズは1700バイトに増加しました。

デモ:

create table test
(
id varchar(800),
id1 varchar(900)
)

insert into test
select replicate('a',800),replicate('b',900)

create index nci on test(id,id1)
6
TheGameiswar