首页 > 解决方案 > 在 SQL Server 中创建索引时收到警告消息

问题描述

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

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

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

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

插入了 100 万条记录。

Created index ix_Test on Test(ProdName)

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

通常Like运营商不使用索引吗?

标签: sqlsql-servertsqlindexingsql-server-2012

解决方案


创建索引时,SQL Server 正在检查列的元数据。SQL Server 2012 的最大索引长度为 900 字节,SQL Server 2016 的最大索引长度为 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<>小提琴演示

警告!最大密钥长度为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

推荐阅读