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

解决方案 »

  1.   

    确定SQL Server填充因子(FILLFACTOR)值的方法
      

  2.   

    填充因子提供填充因子选项是为了优化索引数据存储和性能。当创建或重新生成索引时,填充因子的值可确定每个叶级页上要填充数据的空间百分比,以便在每一页上保留一些剩余空间作为以后扩展索引的可用空间。例如,指定填充因子的值为 80 表示每个叶级页上将有 20% 的空间保留为空,以便随着向基础表中添加数据而为扩展索引提供空间。在索引行之间保留可用空间,而不是在索引的末尾保留。填充因子的值是 1 到 100 之间的百分比,服务器范围的默认值为 0,这表示将完全填充叶级页。
    ms177459.note(zh-cn,SQL.100).gif注意:
    填充因子的值 0 和 100 在所有方面都是相同的。可以使用 CREATE INDEX 或 ALTER INDEX 语句来设置各个索引的填充因子值。若要修改服务器范围的默认值,请使用 sp_configure 系统存储过程。若要查看一个或多个索引的填充因子值,请使用 sys.indexes。
    ms177459.note(zh-cn,SQL.100).gif重要提示:
    只有在创建或重新生成了索引后,才会应用填充因子设置。SQL Server 数据库引擎并不会在页中动态保持指定的可用空间百分比。如果试图在数据页上保持额外的空间,将有背于使用填充因子的本意,因为随着数据的输入,数据库引擎将不得不在每一页上进行页拆分,以保持填充因子所指定的可用空间百分比。 性能注意事项
    页拆分正确选择填充因子值可提供足够的空间,以便随着向基础表中添加数据而扩展索引,从而降低页拆分的可能性。如果向已满的索引页添加新行,数据库引擎将把大约一半的行移到新页中,以便为该新行腾出空间。这种重组称为页拆分。页拆分可为新记录腾出空间,但是执行页拆分可能需要花费一定的时间,此操作会消耗大量资源。此外,它还可能造成碎片,从而导致 I/O 操作增加。如果经常发生页拆分,可通过使用新的或现有的填充因子值来重新生成索引,从而重新分发数据。有关详细信息,请参阅重新组织和重新生成索引。虽然采用较小的非零填充因子值可减少随着索引的增长而拆分页的需求,但是索引将需要更多的存储空间,并且会降低读取性能。即使对于面向许多插入和更新操作的应用程序,数据库的读取次数一般也会超过数据库写入次数的 5 到 10 倍。因此,指定一个不同于默认值的填充因子会降低数据库的读取性能,而降低量与填充因子设置的值成反比。例如,当填充因子的值为 50 时,数据库的读取性能会降低两倍。读取性能降低是因为索引包含较多的页,因此增加了检索数据所需的磁盘 I/O 操作。
    将数据添加到表的末尾如果新数据在表中均匀分布,则不是 0 或 100 的非零填充因子对性能有利。但是,如果所有数据都添加到表的末尾,则不会填充索引页中的可用空间。例如,如果索引键列是 IDENTITY 列,则新行的键将总是增加,并且索引行在逻辑意义上将添加到索引的末尾。如果将用加长行的大小的数据来更新现有行,则请使用小于 100 的填充因子。每页上的额外字节将有助于把行中的额外长度造成的页拆分降低到最小限度。
      

  3.   

    ...
    如果相关的索引,是用在大量的查询的话,怎么设置?
    --》查看关于查询优化的资料。
    如果相关的索引,insert,update,delete比较频繁的话,要该如何设置呢?
    --》要把填充因子设相对大些,以避免过多的页分割。
    ...索引加快查询速度,但影响修改的效率。