我有一个包含两列的表。当我尝试为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
运算符通常不使用索引吗?
答案 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.
警告!密钥的最大长度为 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