VARCHAR列上的索引
一年前,我写了在索引的导航结构里,SQL Server如何存储VARCHAR列。我们都知道,在SQL Server里索引(聚集索引,非聚集索引)的键列有最大900byte的大小限制。
假设现在你想捉弄下SQL Server,在VARCHAR(8000)的列上创建一个索引,并在索引键列上插入超900byte的值。想想,SQL Server会如何反应?不知道?我们来试验下。在下列代码里,我创建了有VARCHAR(8000)列的表,并在这列上创建非聚集索引。
USE TempDb GO -- Create a simple table CREATE TABLE Foo ( Bar VARCHAR(8000) ) GO -- Create a simple Non-Clustered Index CREATE NONCLUSTERED INDEX idx_Bar ON Foo(Bar) GO
SQL Server这里已给你一个插入/更新操作会失败的警告:
现在糟糕的事情发生了:我插入一条901byte大小列的记录。
-- Insert a too large index key column... INSERT INTO Foo VALUES(REPLICATE('x', 901)) GO
偶滴神——如你所见,现在插入不会发生:
SQL Server还是会确保我们的键大小在900bytes限制内。我们来插入刚好900bytes键大小的记录。
-- This will work INSERT INTO Foo VALUES(REPLICATE('x', 900)) GO
现在这个会正常运行,没有问题。但如果我们再次更新那列,让它大于900bytes,会发生什么?
-- This UPDATE will fail UPDATE Foo SET BAR = REPLICATE('x', 901) GO
UPDATE语句也会失败!这是对的。SQL Server再次保证键大小还是在它限制里。啥收获?不管你怎么折腾,你不会打破SQL Server。
感谢关注!
参考文章:
http://www.sqlpassion.at/archive/2016/04/25/indexes-on-varchar-columns/
注:此文章为WoodyTu学习MS SQL技术,收集整理相关文档撰写,欢迎转载,请在文章页面明显位置给出此文链接!
若您觉得这篇文章还不错请点击下右下角的推荐,有了您的支持才能激发作者更大的写作热情,非常感谢!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?