转发:若删除了表中的聚集索引会怎样? (此篇文章很不错)
问题:
经常谈到聚集索引就是“数据”,但是并不完全理解其真正含义。如果删除了表中的聚集索引,会丢失数据吗?
回答:
经常有人谈到此问题,索引结构容易使人迷惑,索引似乎很神秘,到头来认为非常复杂。表可以或没有聚集索引的形式存储,如果没有聚集索引的表,则称之为“堆”(Heap),反之,则称之为“聚集表”。当创建了聚集索引,SQL Server会临时复制Heap堆中的Pages页面,并按聚集键的顺序存储数据,最终将原来那些Heap中的Pages页删除。从这一点来说,SQL Server逻辑上维护着一张双链表(B+树--通过指针来查找数据)。
另外,当查询使用非聚集索引时,聚集索引有助于快速查找数据。非聚集索引提供了一种不同于聚集索引键的有效查找数据的方法。比如:在Employee表上,为EmployeeID创建了聚集索引,此时,聚集索引键EmployeeID为重复出现在非聚集索引记录中,主要使用聚集索引键来获取存储在聚集索引数据行的列数据(此过程也称之为“书签查找”或“键查找”)。
不过,删除了表中的聚集索引,所有非聚集索引则会相应发生改变,但是,数据并不会删除,只是数据存储的顺序不需要维护(即聚集索引中的索引组件)。非聚集索引会采用聚集索引键来查找对应的数据行,因此,当聚集索引删除后,非聚集索引需要修改,以使用另外一种方法来查找对应的数据行,其原因是不存在聚集键。
在没有聚集索引的情况下,查找记录行的直接方法是使用数据行在数据库中的物理位置(行标识RID--由文件号,页号,记录号(槽号)构成)。由于不存在聚集索引,非聚集索引中则需要包含RID。因此,当聚集索引删除时,所有非聚集索引需要重建,以使用RID的方法在堆中定位对应的数据行。
重建表的所有非聚集索引的开销比较大。当聚集索引也用于主键或唯一键,也称为外键引用,在这种情况下,要删除主键,需要先删除所有的外键引用。虽然删除聚集索引不会删除数据,删除前仍需要慎重考虑。
与索引相关的问题比较多,索引最佳实践经常是此系列的主题,我会在后续的其他索引问题中讨论。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决