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

在SQL Server中创建索引时获取警告消息,sql,sql-server,tsql,indexing,sql-server-2012,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) SQL Server是否会在where条件中的ProdName列

我有一个包含两列的表。当我试图为
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是否会在
where
条件中的
ProdName
列上使用此索引?因为它是用警告消息创建的


创建索引时,
Like
操作符通常不使用索引吗?

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.

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


这意味着在列中,字符串值小于450个字符(900字节)


对于第二个问题,只要条件是:


你真的需要nvarchar(2000)上的索引吗?如果您真的要有这么长的值,那么您可能需要查看全文索引。谢谢。对于第一个问题,索引是为带有警告消息的表创建的。因此,它不会在where条件下使用此索引搜索此列值吗?我是否正确?@Ram它将使用索引搜索可搜索条件。简单地说,您将无法为长度超过450个字符的字符串创建索引或插入/更新。精细打印说明:类似于
。。。其中,类似于“%Bar%”的Foo将不会导致索引搜索,但可能会受益于索引扫描。更复杂的条件,例如
。。。其中ShoeSize='9EEE'和Foo-like'%Bar%'
可能受益于更复杂的索引,例如
ShoeSize
上的索引,包括
Foo
或覆盖索引。因此,“无索引使用”可能有点苛刻。@HABO是的,你是对的。查询将运行得更快一些。当然没有索引搜索那么快,但总是有小的增益总比没有好:)
SELECT MAX(DATALENGTH(ProdName))
FROM Test;
-- should be lower than 900
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