在SQL Server中创建索引时收到警告消息



我有一个包含两列的表。当我尝试为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

相关内容

  • 没有找到相关文章

最新更新