Sqlserver填充因子测试

CREATE TABLE [dbo].[test](
    [id] [int] IDENTITY(1,1) NOT NULL primary key,
    [aa] [int] NULL,
    [bb] [int] NULL)
    
CREATE NONCLUSTERED INDEX [aa] ON [dbo].[test] 
(
    [aa] ASC
    )

CREATE NONCLUSTERED INDEX [bb] ON [dbo].[test] 
(
    [bb] ASC
)WITH (FILLFACTOR = 50)


建立测试用的表,index_aa无填充因子,index_bb50%填充因子,然后开始灌数据

declare @aa int
declare @bb int
set @aa=50
set @bb=50
while @aa<1000000
begin
insert into [test](aa,bb)
select @aa,@bb
set @aa=@aa+50
end

然后看一下索引占用页
name page_count
aa         35
bb         35
PK_test  52

发现有填充因子和没有填充因子的索引,占用的数据页是一样的。

然后我们再重建index_bb

CREATE NONCLUSTERED INDEX [bb] ON [dbo].[test] 
(
    [bb] ASC
)WITH (FILLFACTOR = 50,DROP_EXISTING=ON)

然后再看一下索引页
name page_count
PK_test 52
aa        35
bb        69

发现重建后的索引才满足填充因子,所以填充因子只有在已经有数据的表里才有体现,在表初建时添加填充因子是没有意义的。

然后我们继续测试一下,建完填充因子后,再往数据后添加时,填充因子是否有用。

declare @aa int
declare @bb int
set @aa=1000001
set @bb=1000001
while @aa<10000000
begin
insert into [test](aa,bb)
select @aa,@bb
set @aa=@aa+500
end

然后再看索引数据页
name page_count
aa         66
bb        100

之间相差和之前相差的一样,还是34页,所以填充因子对之后的数据依然不起效果。

总结一下,填充因子是一个看上去很美的东西,但是在表初建时完全无用,只有再重建索引时才会有所体验,然而对后期灌入的稍大数据一样不会有效果。

原文地址:https://www.cnblogs.com/lweia/p/3570861.html