fllfactor为这个表的填充因子,toast.filfactor 是这个表中TOAST表的填充因子。填充因子是一个从10到100的整数,表示在插人数据时,在一个数据块中填充百分之多少的空间后就不再填充了,另一部分空间预留了更新时使用。比如,设置为60,则表示往一个数据块中插人的数据占用60%的空间后,就不再往这个数据块中插数据了。而保留的这40%的空间,就是为了更新数据时使用。
在PostgreSQL中,更新一条数据时,旧的数据行并不会被覆盖,而是会插人一条新的数据行,如果块中有空闲空间,则新行直接插人到这个数据块中,由于行仍然在这个数据块中,因此PostsgreSQL可以使用到Heap-Only Tuple 技术,Heap-Only Tuple会在旧行与新行之间建一个链表,这样一来,就不需要更新索引了,索引项仍会指向旧行,但通过旧行与新行之间的链表可以找到最新的行。因为Heap-Only Tuple的链表不能跨数据块,如果新行必须插入新的数据块中,则无法使用Heap-Only Tuple技术,这时就需要更新这表上的所有索引了,这将导致很大的开销。所以对于更新频繁的表需要设置一个较小的fllfactor值。
这个参数可以在建表时设置;
create table table02(.........) with (fillfactor=50);
也可以使用alter table来修改
alter table table02 set (fillfactor=50);
创建索引时,可以指定一个填充因子,以便在索引的每个叶级页上留出额外的间隙和保留一定百分比的空间,供将来表的数据存储容量进行扩充和减少页拆分的可能性。填充因子的值是从 0 到 100 的百分比数值,指定在创建索引后对数据页的填充比例。值为 100 时表示页将填满,所留出的存储空间量最小。只有当不会对数据进行更改时(例如,在只读表中)才会使用此设置。值越小则数据页上的空闲空间越大,这样可以减少在索引增长过程中对数据页进行拆分的需要,但需要更多的存储空间。当表中数据会发生更改时,这种设置更为适当。
填充因子越大,意味着一个索引页包含的索引记录越多,空闲空间越小.一般来说查询的效率越高,因为这样查询的时候,可以减少读取索引页的工作量和减少内存使用
但这样导致的结果是数据变动导致的索引维护的工作量增加,因为索引页的空闲空间小,如果不能在本页内完成索引调整,就会引起调整其他索引页
所以一般的选择是,数据基本不变化的(例如OLAP的场景,数据只用来分析的),将填充因子设置到足够大,数据经常变化的(例如OLTP的场景),将填充因子设置为足够小
把索引的填充因子(fillfactor)设置为50;
alter index idx_contacts_name_old set (fillfactor = 50);
把索引的填充因子重置为默认值
alter index idx_contacts_name_old reset (fillfactor);