非聚集索引及其性能优化

 

建立在主键之上:

CREATE NONCLUSTERED INDEX [IX_#Test] ON #Test
(
TestNumber ASC
)WITH (FILLFACTOR=90) ON [PRIMARY]

非主键之上:

CREATE NONCLUSTERED INDEX [IX_#Test] ON #Test
(
TestNumber ASC
)WITH (FILLFACTOR=90) 

 fill factor:

使用 fill factor 选项可以指定 Microsoft SQL Server 2005 使用现有数据创建新索引时将每页填满到什么程度。由于在页填充时 SQL Server 必须花时间来拆分页,因此填充因子会影响性能。

仅在创建或重新生成索引时使用填充因子。页面不会维护在任何特定的填充水平上。

fill factor 的默认值为 0;其有效值的范围为从 0 到 100。当 FILLFACTOR 设置为 0 或 100 时,将完全填充叶级别。很少需要更改 fill factor 的默认值,因为可以使用 CREATE INDEX 或 ALTER INDEX REBUILD 语句来覆盖其对于指定索引的值。

填充因子:

提供填充因子选项是为了优化索引数据存储和性能。当创建或重新生成索引时,填充因子值可确定每个叶级页上要填充数据的空间百分比,以便保留一定百分比的可用空间供以后扩展索引。例如,指定填充因子的值为 80 表示每个叶级页上将有 20% 的空间保留为空,以便随着在基础表中添加数据而为扩展索引提供空间。在每页上的索引行之间(而不是页的末尾)保留空白区域。

填充因子值是 1 到 100 之间的一个百分比。在大多数情况下,服务器范围的默认值 0 是最佳选项。如果将填充因子设置为 0,则将完全填充叶级别。ms177459.note(zh-cn,SQL.90).gif注意:填充因子值 0 和 100 意义相同。

可以使用 CREATE INDEX 或 ALTER INDEX 语句来设置各个索引的填充因子值。若要修改服务器范围的默认值,请使用 sp_configure 系统存储过程。若要查看一个或多个索引的填充因子值,请使用 sys.indexes 目录视图。

ms177459.note(zh-cn,SQL.90).gif重要提示:
只有在创建或重新生成了索引后,才会应用填充因子。SQL Server 2005 数据库引擎并不会在页中动态保持指定的可用空间百分比。如果试图在数据页上保持额外的空间,将有背于使用填充因子的本意,因为随着数据的输入,数据库引擎将不得不在每个页上进行页拆分,以保持填充因子所指定的可用空间百分比。

 

 页拆分:

正确选择填充因子值可提供足够的空间以便随着向基础表中添加数据而扩展索引,从而减少页拆分可能性。

如果向已满的索引页添加新行,数据库引擎将把大约一半的行移到新页中,以便为该新行腾出空间。这种重组称为页拆分。页拆分可为新记录腾出空间,但是执行页拆分可能需要花费一定的时间,此操作会消耗大量资源。此外,它还可能造成碎片,从而导致 I/O 操作增加。如果经常发生页拆分,可通过使用新的或现有的填充因子值来重新生成索引,从而重新分发数据。

尽管采用较低的填充因子值(非 0)可减少随着索引增长而拆分页的需求,但是索引将需要更多的存储空间,并且会降低读取性能。即使对于面向许多插入和更新操作的应用程序,数据库读取次数一般也超过数据库写入次数的 5 到 10 倍。因此,指定一个不同于默认值的填充因子会降低数据库的读取性能,而降低量与填充因子设置的值成反比。例如,当填充因子的值为 50 时,数据库的读取性能会降低两倍。读取性能降低是因为索引包含较多的页,因此增加了检索数据所需的磁盘 I/O 操作。

向表末尾添加数据:

如果新数据在整个表中平均分布,则非零填充因子有助于提高性能。不过,如果所有数据都添加到表末尾,将填充空白区域。例如,如果索引键列为 IDENTITY 列,则新行的键会一直增加,行会按逻辑添加到表末尾。这种情况下,页拆分不会导致性能下降。应使用默认填充因子 0,或指定填充因子 100 以便填充叶级。

 

注:本文由fang_beny创作,转载请注明出处。谢谢!

原文地址:https://www.cnblogs.com/fang-beny/p/nonindex.html