整理SQL Server的索引碎片
软件世界
前言:在第38期的《电脑报》,我们为大家介绍了利用DBCC来检查和修复SQL Server的方法。其实DBCC的功能并不局限于此,在这篇文章里,我们将为大家介绍一下利用DBCC来实现整理索引碎片这个重要的功能。
和计算机硬盘一样,SQL Server在使用了一段时间后也会出现碎片。对于SQL Server而言,其中的碎片其实就是索引碎片。这些碎片的产生将会降低数据库的运行速度,为了保证数据库的运行效率我们必须定期清理这些碎片。
由于没有图形化的操作界面,我们只能使用DBCC语句来处理。下面是要使用的DBCC语句:
DBCC SHOWCONTIG:显示指定的表的数据和索引的碎片信息。
DBCC INDEXDEFRAG:整理指定的表或视图的聚集索引和辅助索引碎片。
DBCC DBREINDEX:重建指定数据库中表的一个或多个索引。
对于第二个和第三个语句,我们通常只使用其中的一个。两者的差别是,前者主要是整理原有的索引,后者则将原来的索引删除,然后重新建立索引。
下面我们来看看具体如何操作:
一、查看碎片
打开查询分析器,选择相应的数据库,然后输入下列命令:DBCC SHOWCONTIG并运行。等待片刻后,我们可以看到它将数据库中的所有表都做了一个扫描,并且将每个表的碎片结果都显示了出来。同时还显示了其他的项。我们所要看的是:扫描密度[最佳值:实际值]和逻辑扫描碎片这两列,如果前者的比例显示是1∶1后者是0%,那么表明索引没有碎片。图1是DBCC SHOWCONTIG执行的效果。
除了对数据库中的所有表做一个碎片检查外,我们也可以指定对某个表做一次碎片检查。输入DBCC SHOWCONTIG (IA_tblRCsetM),这个命令是对IA_tblRCsetM表做一次碎片检查。如果我们在扫描的时候使用了FAST参数,那么扫描速度会变快:DBCC SHOWCONTIG (IA_tblRCsetM) with fast,不过扫描后给出的相关信息将减少。
SHOWCONTIG的具体语法:
DBCC SHOWCONTIG
[({table_name|table_id|view_name|view_id}[,index_name|index_id])]
[WITH{ALL_INDEXES|FAST[,ALL_INDEXES]|TABLERESULTS[,{ALL_INDEXES}][,{FAST|ALL_LEVELS}]}]
二、整理索引
在查询分析器中输入:DBCC INDEXDEFRAG (UFDATA_008_2004,IA_tblRCsetM,PK_IA_tblRCsetM)。其中UFDATA_008_2004是数据库名,IA_tblRCsetM是表名,PK_IA_tblRCsetM是索引名,这3个参数是必需的。此外当你不知道你的表是否有索引或索引名是什么的时候,你可以打开企业管理器,找到相应的表然后右击,选择“所有任务→索引管理”,随后会出现索引管理窗口,然后点击“索引管理”窗口中的“编辑”,将出现编辑窗口(图2)。在此窗口中我们就可以看到表的索引名了。
DBCC INDEXDEFRAG基本语法:
DBCC INDEXDEFRAG({database_name|database_id|0},{table_name|table_id|'view_name'|view_id},{index_name|index_id} )[WITH NO_INFOMSGS]
三、重建索引
在查询分析器中输入:DBCC DBREIN DEX('UFDATA_008_2004.dbo.IA_tblRCset M'),其中UFDATA_008_2004是数据库名,dbo是表的所有者,IA_tblRCsetM是表名。当执行成功后系统会提示你:“DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系”。请注意,我们这里是重建表IA_tblRCsetM的所有索引。如果你只想重建表中某一个索引的话,你可以输入:DBCC DBREINDEX ('UFDATA_008_2004.dbo.IA_tblRCsetM',PK_IA_tblRCsetM),那么就只有表中的名为PK_IA_tblRCsetM的索引被重建了。
DBCC DBREINDEX的基本语法:
DBCC DBREINDEX (['database.owner.table_name'[,index_name[,fillfactor]]]) [WITH NO_INFOMSGS]
整理和重建分析比较
那么我们在什么时候使用DBCC INDEXDEFRAG,在什么时候使用DBCC DBREINDEX呢?一个简单的原则是当表的索引碎片少且索引不多的时候使用DBCC INDEXDEFRAG;当索引碎片多并且索引个数多的时候使用DBCC DBREINDEX。此外如果我们要对视图的索引做碎片整理的时候,我们只可以使用DBCC INDEXDEFRAG。
还有一点是DBCC DBREINDEX中的fillfactor参数,它表示占空因子,也叫做填充因子。占空因子的作用是,由于SQL Server中的数据都是以页为单位的,如果我们指定一个占空因子是70,那么在每个页中只使用70%的空间,剩余的30%的空间被保留。如果你的表在不停地添加数据,那么索引也会增加。这些增加的索引就会使用剩余的30%的空间。
这样做的好处是因为预留了空间,最大限度地将数据集中在一个页中,提高了索引的效率。只有到剩余空间使用完后,系统才会建立新页,同时在新页中也会保留30%的剩余空间。下面我们看看在DBCC DBREINDEX中的fillfactor参数怎么用。在查询分析中输入:DBCC DBREINDEX ('UFDATA _008_2004.dbo.IA_tblRCset M',PK_IA_tblRCsetM,70),此时系统将在执行重建索引时只使用70%的空间,命令中的70就是占空因子。如果你没有使用占空因子参数,那么系统将使用原来索引中的占空因子。如果你想查看占空因子,可以在图2的下方看到。

