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