合 PG和GP中的表和索引的填充因子fillfactor介绍
Tags: GreenPlumPostgreSQL填充因子fillfactor
简介
在 PostgreSQL 中,fillfactor
是一个用于控制表和索引存储密度的参数。它决定了每页上数据的填充程度,通常以百分比表示。
fillfactor 的设置跟业务模型是息息相关的,如果数据类似日志那样是递增且完全没有更新的,那么表和索引的 fillfactor 设置成 100 无可厚非。
但是大部分业务表总是有更新的,表和索引 fillfactor 就不应该设置成 100,如果是频繁的 update,那么 fillfactor 应该设置得更低。
PG中默认的 fillfactor 如下:
- 表默认 fillfactor=100
索引默认 fillfactor=90
B树使用默认填充因子90,但可以选择10到100之间的任何整数值。 如果表是静态的,则fillfactor 100最好最大程度地减小索引的物理大小, 但是对于大量更新的表,较小的fillfactor更好地最小化对页面拆分的需求。 其他索引方法以不同但大致相似的方式使用fillfactor;默认的填充因子因方法而异。
table(默认100)
一个表的填充因子是一个10-100质检的百分数。100(完全填满)是默认值。设置较小的填充因子,insert操作会把表页面只填满到指定的百分比,剩余的空间留给页面上行的更新。这就让update有机会把一行的已更新版本放到在与原始版本相同的页面上,这比把它放在一个不同的页面上效率更高。对于不经常更新的表来说,设置为100是最好的选择,如果更新频繁设置较小的值更合适。这个参数对toast表不生效。
index(fillfactor默认90)
索引的填充因子是一个百分数,它决定索引方法将尝试填充索引页面的充满程度。对于B-tree,在初始的索引构建过程中,叶子页面会被填充至该百分数,B-tree默认的填充因子是90,可以设置为10-100的任何整数值。如果表是静态的,那么填充因子100是最好的,这样索引占用空间最小。对于更新频繁的表,设置较小的值有利于最小化页面分裂。
优缺点
配置 fillfactor
的主要优缺点如下:
优点
减少页拆分:通过将
fillfactor
设置为较低的值,可以减少由于插入和更新操作导致的页拆分。这在高更新频率的表上尤为重要,能够减少碎片化并提高性能。提高写入性能:较低的
fillfactor
值可以减少更新和插入操作时的行溢出,从而减少 I/O 操作,提高写入性能。优化查询性能:如果表的行经常被更新,使用较低的
fillfactor
可以减少行溢出,从而优化查询性能,特别是在需要高效扫描或读取的情况下。
缺点
增加存储空间使用:设置较低的
fillfactor
值会导致每页存储的数据减少,从而增加总的存储需求。对于大数据量的表,这可能会显著增加存储成本。可能导致读取效率下降:如果
fillfactor
设置得过低,可能会导致更多的页读操作,因为每页的数据量减少了。这在读取大量数据时可能导致性能下降。需要更多的维护工作:表的维护工作(如 VACUUM 和 REINDEX)可能需要更多的时间和资源,因为更低的
fillfactor
值会导致更多的页和索引碎片。
在选择合适的 fillfactor
值时,需要权衡存储需求与性能需求。通常,较低的 fillfactor
值适用于写入和更新操作频繁的表,而较高的 fillfactor
值适用于读取操作较多的表。
相关SQL
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | -- 配置 alter table tab5 set (fillfactor=80); alter index idx_tab5_a set (fillfactor=80); CREATE UNIQUE INDEX title_idx ON films (title) WITH (fillfactor = 70); -- 表 SELECT relname AS table_name, reloptions AS options FROM pg_class WHERE relname = 't1' AND relkind = 'r'; -- 索引 SELECT idx.relname AS index_name, ind.reloptions AS options FROM pg_class AS idx JOIN pg_index AS i ON idx.oid = i.indexrelid JOIN pg_class AS tab ON i.indrelid = tab.oid WHERE tab.relname = 't1'; |
如果 reloptions
中包含 fillfactor=N
,则表示 fillfactor
被设置为 N
,否则使用默认值(通常是 100)。
实验
为了设计一个实验来验证 fillfactor
配置对表膨胀的影响,可以通过以下步骤进行实验。实验的核心是通过设置不同的 fillfactor
来比较表在频繁更新操作后的膨胀情况(表膨胀是指由于更新或删除操作产生的无用空间的增加)。