转发:若删除了表中的聚集索引会怎样? (此篇文章很不错)

原文:此文源自http://www.sqlmag.com/blogs/sql-server-questions-answered/sql-server-questions-answered/tabid/1977/entryid/12748/Default.aspx

问题:
   经常谈到聚集索引就是“数据”,但是并不完全理解其真正含义。如果删除了表中的聚集索引,会丢失数据吗?

回答:

  经常有人谈到此问题,索引结构容易使人迷惑,索引似乎很神秘,到头来认为非常复杂。表可以或没有聚集索引的形式存储,如果没有聚集索引的表,则称之为“堆”(Heap),反之,则称之为“聚集表”。当创建了聚集索引,SQL Server会临时复制Heap堆中的Pages页面,并按聚集键的顺序存储数据,最终将原来那些Heap中的Pages页删除。从这一点来说,SQL Server逻辑上维护着一张双链表(B+树--通过指针来查找数据)。

  另外,当查询使用非聚集索引时,聚集索引有助于快速查找数据。非聚集索引提供了一种不同于聚集索引键的有效查找数据的方法。比如:在Employee表上,为EmployeeID创建了聚集索引,此时,聚集索引键EmployeeID为重复出现在非聚集索引记录中,主要使用聚集索引键来获取存储在聚集索引数据行的列数据(此过程也称之为“书签查找”或“键查找”)。

  不过,删除了表中的聚集索引,所有非聚集索引则会相应发生改变,但是,数据并不会删除,只是数据存储的顺序不需要维护(即聚集索引中的索引组件)。非聚集索引会采用聚集索引键来查找对应的数据行,因此,当聚集索引删除后,非聚集索引需要修改,以使用另外一种方法来查找对应的数据行,其原因是不存在聚集键。

  在没有聚集索引的情况下,查找记录行的直接方法是使用数据行在数据库中的物理位置(行标识RID--由文件号,页号,记录号(槽号)构成)。由于不存在聚集索引,非聚集索引中则需要包含RID。因此,当聚集索引删除时,所有非聚集索引需要重建,以使用RID的方法在堆中定位对应的数据行。

  重建表的所有非聚集索引的开销比较大。当聚集索引也用于主键或唯一键,也称为外键引用,在这种情况下,要删除主键,需要先删除所有的外键引用。虽然删除聚集索引不会删除数据,删除前仍需要慎重考虑。

  与索引相关的问题比较多,索引最佳实践经常是此系列的主题,我会在后续的其他索引问题中讨论。

posted @ 2015-04-24 11:11  阿玛  阅读(1260)  评论(0编辑  收藏  举报