<P>在创建聚集索引时,表中的数据按照索引列中的值的顺序存储在数据库的数据页中。在表中插入新的数据行或更改索引列中的值时,Microsoft&reg; SQL Server&trade; 2000 可能必须重新组织表中的数据存储,以便为新行腾出空间,保持数据的有序存储。这同样适用于非聚集索引。添加或更改数据时,SQL Server 可能不得不重新组织非聚集索引页中的数据存储。向一个已满的索引页添加某个新行时,SQL Server 把大约一半的行移到新页中以便为新行腾出空间。这种重组称为<!--glossary--><NOBR><A ID="PopUp" HREF="#sql:page_split" CLASS="PopLink"><U>页拆分</U></A></NOBR><!--/glossary-->。页拆分会降低性能并使表中的数据存储产生碎片。有关更多信息,请参见<A HREF="JavaScript:;">表和索引构架</A>。</P><P>创建索引时,可以指定一个<!--glossary--><NOBR><A ID="PopUp" HREF="#sql:fill_factor" CLASS="PopLink"><U>填充因子</U></A></NOBR><!--/glossary-->,以便在索引的每个<!--glossary--><NOBR><A ID="PopUp" HREF="#sql:leaf_level" CLASS="PopLink"><U>叶级</U></A></NOBR><!--/glossary-->页上留出额外的间隙和保留一定百分比的空间,供将来表的数据存储容量进行扩充和减少页拆分的可能性。填充因子的值是从 0 到 100 的百分比数值,指定在创建索引后对数据页的填充比例。值为 100 时表示页将填满,所留出的存储空间量最小。只有当不会对数据进行更改时(例如,在只读表中)才会使用此设置。值越小则数据页上的空闲空间越大,这样可以减少在索引增长过程中对数据页进行拆分的需要,但需要更多的存储空间。当表中数据会发生更改时,这种设置更为适当。</P><P>提供填充因子选项是为了对性能进行微调。但是,使用 <B>sp_configure</B> 系统存储过程指定的服务器范围的默认填充因子,在大多数情况下都是最佳的选择。 </P><P class=indent><!--NOTE--><P ID="Alert_Note"><B>说明</B>&nbsp;&nbsp;即使对于一个面向许多插入和更新操作的应用程序来说,数据库读取次数一般也超过数据库写入次数的 5 到 10 倍。因此,指定一个不同于默认设置的填充因子会降低数据库的读取性能,而降低量与填充因子设置值成反比。例如,当填充因子的值为 50% 时,数据库的读取性能会降低两倍。</P><!--/NOTE--></P><P>只有当在表中根据现有数据创建新索引,并且可以精确预见将来会对这些数据进行哪些更改时,将填充因子选项设置为另一个值才有用。</P><P>填充因子只在创建索引时执行;索引创建后,当表中进行数据的添加、删除或更新时,不会保持填充因子。如果试图在数据页上保持额外的空间,则将有背于使用填充因子的本意,因为随着数据的输入,SQL Server 必须在每个页上进行页拆分,以保持填充因子指定的空闲空间百分比。因此,如果表中的数据进行了较大的变动,添加了新数据,可以填充数据页的空闲空间。在这种情况下,可以重新创建索引,重新指定填充因子,以重新分布数据。</P>

解决方案 »

  1.   

    比如说填充因子的植是70则你的数据页用70%的空间来存储数据,留出30%为了给以后新插入的行提供空间,而不会因数据页满了,在插入时还得从新组织页的分配,浪费时间和资源.
    索引就象字典里前面的目录,方便于查询,提高速度.
    注意:只有在where的条件列上加索引才会起作用,不过我们得到速度的同时,我们还花精力来维护索引.