sql - 在 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
运营商不使用索引吗?
解决方案
创建索引时,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_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
推荐阅读
- java - 处理 3 (JDK11) 中的非法反射访问错误
- azure - Azure-logicApps-将实体插入表中
- types - 什么数据类型最适合通过 i2C (arduino) 发送
- java - 当点击从 WorkManager 发送的通知时,使用导航组件启动特定片段
- java - 如何从日历对话框中获取相关的星期几而不是先前选择的日期
- android-studio - 从 Android-Studio 运行时,应用程序给出安装失败的错误
- git - Intellij IDE - 在 GIT 分支之间切换时删除文件夹
- python - 基于另一个 Django 模型的多个字段检索唯一 Django 对象的计数
- javascript - 如何创建目录树的基于 JavaScript 对象的表示
- c# - 如何在ac#类中设置数据(多类)