现在的位置: 首页 > 综合 > 正文

填充因子

2012年07月07日 ⁄ 综合 ⁄ 共 1146字 ⁄ 字号 评论关闭

  -- 摘自TechNET December 2007

提示:检查填充因子

  假如您有一个盛满水的玻璃杯,您要尝试再向这个玻璃杯中加水。结果会怎样呢?水会溢出来。

SQL Server 的情况也是如此。当索引页填充满时,如果尝试添加新行,则 SQL Server 会将大约一半的行移动到新页,以便为新添加的行腾出空间。这就是通常所说的页面分割。页面分割可为新记录腾出空间,但却既费时又非常耗费资源,并且会产生碎片,从而可能对 I/O 操作产生负面影响。那么,如何避免此类情况呢?

要防止此类情况的发生,必须主动确定填充因子值。创建或重新构建索引后,填充因子值会确定每个叶级页中用于填充数据的空间百分比,其余部分留作将来扩充之用。例如,将填充因子值配置为 60 就意味着每个叶级页的 40 都是空的,以便在向基础表中添加数据时为索引扩展提供空间。

默认填充因子值始终是 0,此值对大多数情况都适用。一般来讲,填充因子值为 0 意味着叶级别几乎已填满,但留出了一些空间,至少能再添加一个索引行。(请注意,填充因子为 0 100 是相似的。)

您可以在 CREATE INDEX ALTER INDEX 语句中设置各个索引的填充因子值,也可以直接在服务器级别上配置此值,以便所有新建索引都使用默认值。

以下示例在服务器级别将填充因子值设置为 70%,这就意味着您将有 30 的可用空间供以后扩展使用。当然,在实施到生产环境前,必须先认真测试此选项。

USE Master; GO SP_Configure 'show advanced options',1; GO SP_Configure 'Fill Factor', 70; GO --必须重新启动 SQL Server 引擎以使更改生效。

如果您希望在单个索引级别上配置填充因子,应如何操作呢?假设您正在构建下表,并希望对名为 Col_A 的列创建唯一索引,且填充因子值为 70。此时该命令应类似于下面的命令:

--Create an Item table USE Item_DB; GO CREATE TABLE ITEM (Col_A Varchar(100),Col_b Varchar(200)); GO;

 

--Create a unique index on colum Col_A of Item table with a Fill Factor value of 70 CREATE UNIQUE INDEX AK_Index ON Item (Col_A) WITH (FillFactor = 70); GO

如何识别每个索引的填充因子?可以查询 sys.Indexes 以从数据库中获取所有索引的填充因子值,如下所示:

USE Item_DB; GO SELECT Fill_Factor FROM Sys.Indexes WHERE Object_id=object_id('item') AND name IS NOT NULL; GO

抱歉!评论已关闭.