本主题介绍什么是填充因子,以及如何使用 SQL Server Management Studio 或 Transact-SQL 在 SQL Server 2014 中的索引上指定填充因子值。
提供了填充因子选项,用于微调索引数据存储和性能。 创建或重新生成索引时,填充因子值确定要填充每个叶级页面上空间的百分比,并将每个页面上的其余部分保留为将来增长的可用空间。 例如,指定填充因子值 80 表示每个叶级页面的 20% 将留空,为索引扩展提供空间,因为数据将添加到基础表。 在索引行之间保留空格,而不是在索引末尾保留。
填充因子值是 1 到 100 之间的百分比,服务器范围的默认值为 0,这意味着叶级页面已填充到容量。
注释
填充因子值 0 和 100 在所有方面都是相同的。
本主题内容
准备工作:
若要在索引中指定填充因子,请使用:
在您开始之前
性能注意事项
页面拆分
正确选择的填充因子值可以通过为索引扩展提供足够的空间来减少潜在的页拆分,因为数据被添加到基础表。将新行添加到完整索引页时,数据库引擎会将大约一半的行移到新页,以便为新行腾出空间。 此重组称为页面拆分。 页面分裂为新记录腾出空间,但可能需要一些时间才能执行,并且是一项资源密集型操作。 此外,它可能导致碎片化,进而增加I/O操作。 当页面发生多次拆分时,可以通过使用新的或现有的填充因子值重新分配数据来重建索引。 有关详细信息,请参阅 重新组织和重新生成索引。
尽管低、非零填充因子值可能会降低在索引增长时拆分页的要求,但索引将需要更多存储空间,并降低读取性能。 即使对于面向许多插入和更新作的应用程序,数据库读取次数通常比数据库写入数多 5 到 10 个。 因此,指定除默认值以外的填充因子可以按与填充因子设置成反比例减少数据库读取性能。 例如,填充因子值为 50 可能会导致数据库读取性能降低两倍。 读取性能会降低,因为索引包含更多页,因此增加了检索数据所需的磁盘IO操作。
将数据添加到表的末尾
如果新数据在整个表中均匀分布,则设置为除 0 和 100 之外的非零填充因子可能有利于性能。 但是,如果将所有数据添加到表的末尾,索引页中的空白将不会填充。 例如,如果索引键列是 IDENTITY 列,则新行的键始终增加,索引行在逻辑上添加到索引的末尾。 如果更新现有行的数据会使行的大小变大,请使用小于 100 的填充系数。 每个页面上的额外字节有助于最大程度地减少因行中额外长度而导致的页面拆分。
安全
权限
需要对表或视图具有 ALTER 权限。 用户必须是 sysadmin 固定服务器角色的成员或 db_ddladmin 和 db_owner 固定数据库角色的成员。
使用 SQL Server Management Studio
使用表设计器指定填充因子
在对象资源管理器中,单击加号以展开包含需指定索引填充因子的表所在的数据库。
单击加号以展开 “表” 文件夹。
右键单击要指定索引填充因子的表,然后选择 “设计”。
在“表设计器”菜单上,单击“索引/键”。
选择具有您想要指定的填充因子的索引。
展开 填充规范,选择 填充因子 行,并在行中输入所需的填充因子。
单击 “关闭” 。
在“文件”菜单上,选择“保存”以保存 table_name。
使用对象资源管理器在索引中指定填充因子
在对象浏览器中,单击加号展开包含您要指定索引填充因子的表的数据库。
单击加号以展开 “表” 文件夹。
单击加号以展开要为其设置索引填充因子的表格。
单击加号以展开 “索引” 文件夹。
右键单击要指定填充因子的索引,然后选择“属性”。
在 “选择页面”下,选择“ 选项”。
在 “填充因子 ”行中,输入所需的填充因子。
单击 “确定” 。
使用 Transact-SQL
在现有索引中指定填充因子
在 “对象资源管理器” 中,连接到某个数据库引擎实例。
在标准栏上,单击“新建查询”。
将以下示例复制并粘贴到查询窗口中,然后单击 执行。 该示例重新生成现有索引并在重新生成作期间应用指定的填充因子。
USE AdventureWorks2012; GO -- Rebuilds the IX_Employee_OrganizationLevel_OrganizationNode index -- with a fill factor of 80 on the HumanResources.Employee table. ALTER INDEX IX_Employee_OrganizationLevel_OrganizationNode ON HumanResources.Employee REBUILD WITH (FILLFACTOR = 80); GO
在索引中指定填充因子的另一种方法
在 “对象资源管理器” 中,连接到某个数据库引擎实例。
在标准栏上,单击“新建查询”。
将以下示例复制并粘贴到查询窗口中,然后单击 执行。
USE AdventureWorks2012; GO /* Drops and re-creates the IX_Employee_OrganizationLevel_OrganizationNode index on the HumanResources.Employee table with a fill factor of 80. */ CREATE INDEX IX_Employee_OrganizationLevel_OrganizationNode ON HumanResources.Employee (OrganizationLevel, OrganizationNode) WITH (DROP_EXISTING = ON, FILLFACTOR = 80); GO
有关详细信息,请参阅 ALTER INDEX (Transact-SQL)。