42

SQL Server 2012 的 900 字节索引限制的总字符限制是多少。我创建了一个具有 的列varchar(2000),但我认为它超过了 SQL Server 限制的 900 字节?varchar(?)900 字节索引列中的最大值是多少?

4

3 回答 3

53

varchar的存储大小是输入数据的实际长度 + 2 个字节。即使列本身有 2 个字节的开销,您也可以将最多900 个字节的 varchar 值放入索引的列中。

实际上,您可以在大于 900 字节的列上创建索引,但如果您实际尝试插入大于 900 字节的内容,则会遇到问题:

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

对于这些通常对于索引键来说太大的列,您可以通过将它们包含在索引中来获得索引的一些好处。

于 2012-10-03T21:53:28.653 回答
9

在相关说明中,您可以尝试在宽列上获取索引的另一个选项在http://www.brentozar.com/archive/2013/05/indexing-wide-keys-in-sql-server中进行了概述/其中一个哈希列被添加到表中,然后被索引并在您的查询中使用。

于 2013-12-11T16:11:08.570 回答
6

对于 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)
于 2018-02-22T13:14:33.507 回答