在SQL Server中创建索引时获取警告消息

时间:2018-12-16 11:20:43

标签: sql sql-server tsql indexing sql-server-2012

我有一个包含两列的表。当我尝试为NVARCHAR(2000)列创建索引时,它显示警告消息,如:

  

警告!最大密钥长度为900个字节

但是在SQL Server中为此表创建了索引:

Create Table Test
(
     Id Int primary key,
     ProdName Nvarchar(2000)
)

插入了100万条记录。

Created index ix_Test on Test(ProdName)

ProdName条件下,SQL Server会在where列上使用此索引吗?因为它创建时带有警告消息。

Like运算符通常不使用索引吗?

1 个答案:

答案 0 :(得分:3)

在创建索引时,SQL Server正在检查列的元数据。 SQL Server 2012和SQL Server 2016的最大索引长度为900字节(1700字节)。

对于NVARCHAR(2000),最大字节数为4000,并且超出了索引的最大限制。

Create Table Test(Id Int primary key,ProdName Nvarchar(2000));
INSERT INTO Test VALUES (1, REPLICATE('0123456789',45));
Create index ix_Test ON Test(ProdName);
INSERT INTO Test VALUES (2, REPLICATE('0123456789',46));
-- Operation failed. The index entry of length 920 bytes for the index    
--'ix_Test' exceeds the maximum length of 900 bytes.

db<>fiddle demo

  

警告!密钥的最大长度为 900字节。。索引“ ix_Test”的最大长度为4000字节。 对于大值的某些组合,插入/更新操作将失败。


这意味着您的列中的字符串值短于450个字符(900字节)。

SELECT MAX(DATALENGTH(ProdName))
FROM Test;
-- should be lower than 900

只要条件为SARGable,将使用第二个问题索引:

SELECT *
FROM Test
WHERE ProductName = 'ABC' -- index usage;

SELECT *
FROM Test
WHERE ProductName = 'AB%'; -- index usage

SELECT *
FROM Test
WHERE ProductName LIKE '%B%'; -- no index seek, index/table scan instead