我有一个包含两列的表。当我尝试为NVARCHAR(2000)
列创建索引时,它显示了如下警告消息:
警告!最大密钥长度为900字节
但是索引是在SQLServer:中为此表创建的
Create Table Test
(
Id Int primary key,
ProdName Nvarchar(2000)
)
插入了100万条记录。
Created index ix_Test on Test(ProdName)
SQL Server会在where
条件下对ProdName
列使用此索引吗?因为它创建时带有警告消息。
Like
运算符通常不使用索引吗?
创建索引时,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<>小提琴演示
警告!最大密钥长度为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