数据库索引是决定数据库性能的关键。用户每执行一次查询、创建一个视图或游标、或者是以某种方式获取一个数据组,都需要涉及到数据库索引。抛开那些你随随便便建立的数据库索引不谈,你会发现在那些设计优秀的数据库产品中,所有的需要长期进行的数据库操作都是由精心维护的数据库索引来支持的。
数据库系统在存储数据库文件时,有时候会将用到的数据页隔断,使得数据索引的同时会产生一定程度的碎片。当用户强制数据库使用索引中的多入口来访问同一个数据页时,索引碎片会增加系统额外的消耗,这些额外消耗还会带来一些麻烦,尤其是当中心只读数据表的性能对用户影响较大时。为了减小系统消耗,用户可以使用一个能够动态更改的数据表,这种表可以在不分割数据页的情况下允许用户向表里添加数据,不过在性能上则有所降低。因此,用户允许索引碎片的数量决定于你使用的表数据的类型以及你如何使用数据库索引。这也就是在SQL Server数据索引中并没有一个合适的标准值并且提供了一些参数让你控制这个影响性能的问题的原因。
用户可以使用FILLFACTOR参数来管理索引碎片。这个值的范围从1到100,代表了当用户创建索引时,数据容量占页容量的百分比。换句话来说,值1表示用户允许任何数量的碎片,而值100则表示每个数据页在索引创建或重建时就已经处于全满状态了。在现实应用中,实际的填充因子不会大于你指定的FILLFACTOR参数的值,同时FILLFACOR参数也受到数据页类型(叶级或者非叶级)的影响。
你可以在创建索引的同时指定FILLFACTOR的值,就像下面这样:
CREATE NONCLUSTERED INDEX IDname
ON [tablename] (IDname)
WITH DROP EXISTING, FILLFACTOR = 85
重建索引并同时指定FILLFACTOR的值:
DBCC DBREINDEX 9'[tablename]', '', 60)
用户在索引数据的时候如果更改了叶级数据页的分配容量,将会导致非叶级数据页的碎片产生。为了防止这种情况我们通常会为每个数据页留出一条空的纪录。如果用户准备将很多新纪录和数据页添加到叶级数据页中,那么可以指定一个PAD INDEX参数,并为这个参数赋予给非叶级数据页指定的FILLFACTOR参数的值。如果你想同时为这两种类型的数据页指定这两种参数的值,请参照下面的方法:
CREATE NONCLUSTERED INDEX IDname
ON [tablename] (IDname)
WITH DROP EXISTING, FILLFACTOR = 85, PAD INDEX
最后,要限制页碎片,用户可以创建一个索引集群并把参数FILLFACTOR的值指定为100,有必要的话,用户还可以重建索引(假设原先FILLFACTOR的值就是100),请参考下面的方法:
DBCC DBREINDEX ('tablename', packed tablename, 100)
当然,在创建了压缩后的索引后你就可以删除原先未压缩的索引镜像了