手机
当前位置:查字典教程网 >编程开发 >mssql数据库 >SQL Server误区30日谈 第29天 有关堆碎片的误区
SQL Server误区30日谈 第29天 有关堆碎片的误区
摘要:误区#29:可以通过对堆建聚集索引再DROP后进行堆上的碎片整理Nooooooooooooo!!!对堆建聚集索引再DROP在我看来是除了收缩...

误区 #29:可以通过对堆建聚集索引再DROP后进行堆上的碎片整理

Nooooooooooooo!!!

对堆建聚集索引再DROP在我看来是除了收缩数据库之外最2的事了。

如果你通过sys.dm_db_index_physical_stats(或是老版本的DBCC SHOWCONTIG)看到堆上有碎片,绝对不要通过建立聚集索引再删除聚集索引来整理堆碎片。好的做法应该是建立聚集索引之后不再删除,已经有非常多的资料阐述如何选择一个理想的聚集索引键--窄,很少变动,唯一,自增。Kimberly有一篇文章对此做了一个总结:Ever-increasing clustering key - the Clustered Index Debate..........again!(注意,是基于SQL Server 2005版本),对此我也有一个例子:An example of a nasty cluster key。

你也可以在SQL Server 2008中通过ALTER TABLE ... REBUILD来清除堆碎片,但这个做法和建立聚集索引后再删除同样邪恶。

如果你想问为什么我对此甚有成见?好吧,那我解释一下:非聚集索引中每一行都会指向一个RID或是聚集索引键的链接(详情请看:What Happens if I Drop a Clustered Index?),这个链接会以下面两种方式之一出现:

如果非聚集索引所在的表是堆,那么这个链接就是一个RID。

如果非聚集索引所在的表是聚集索引,那么这个链接就是聚集索引键。

如果你希望对此有更多了解,请看文章底部的链接。

因此不难看出,如果你希望将堆变为聚集索引,那么非聚集索引的所有RID就失效了,因此所有的非聚集索引都需要被重建。同样,如果删除聚集索引键,那么所有非聚集索引上存储的聚集索引键都会失效,因此也需要重建所有的非聚集索引。

简单点说,如果你建立再删除聚集索引后,所有的非聚集索引都会被重建两次。

如果你使用SQL Server 2008的ALTER TABLE ... REBUILD来整理堆碎片,那么同样也需要重建所有的非聚集索引,因为所有的RID都会变动。

那么,如果对于“重建”聚集索引呢?这取决于SQL Server的版本以及你是进行rebuild索引亦或是改变索引。一个常见的误区是对表进行分区将会改变聚集索引键,但事实上不会。对于那些会引起非聚集索引重建的操作,请看如下列表:Indexes From Every Angle: What happens to non-clustered indexes when the table structure is changed?。

【SQL Server误区30日谈 第29天 有关堆碎片的误区】相关文章:

提升SQL Server速度 整理索引碎片

SQL Server 2005 数据维护实务

Sql server 取当天或当月的记录

SQLServer 设置单词首字母大写

SQLServer 数据库开发顶级技巧

Sql server 2005安装时ASP.Net版本注册要求警告的解决方法

压缩技术给SQL Server备份文件瘦身

SQL Server 2005 同步复制技术

sqlserver 2000 远程连接 服务器的解决方案

SQL Server2008中删除重复记录的方法分享

精品推荐
分类导航