表填充因子和索引填充因子的区别

S S*_*hah 17 postgresql

在 Postgres 中,可以为索引和表设置填充因子。有什么不同?如何决定两者的值。有哪些用例?

我正在尝试对空间索引上的空间关系进行聚类。它有几百万条记录。尽管每天创建的新记录很少,但记录一直在更新。

用例是空间范围查询。表填充因子和/或索引填充因子的好值是多少?

小智 16

CREATE TABLE 手册页(强调添加):

的填充因子是 10 到 100 之间的百分比。100(完全填充)是默认值。当指定较小的填充因子时,INSERT 操作仅将表页打包到指定的百分比;每页上的剩余空间保留用于更新该页上的行。这使 UPDATE 有机会将行的更新副本放置在与原始页面相同的页面上,这比将其放置在不同的页面上效率更高。对于条目从不更新的表,完全填充是最佳选择,但在大量更新的表中,较小的填充因子是合适的。

CREATE INDEX 手册页(强调添加):

索引的填充因子是一个百分比,它决定了索引方法将尝试打包索引页的填充程度。对于 B 树,在初始索引构建期间以及在右侧扩展索引(最大键值)时,叶页会填充到此百分比。如果页面随后变得完全充满,它们将被拆分,导致索引效率逐渐下降。B 树使用默认填充因子 90,但可以选择 10 到 100 之间的任何值。如果表是静态的,那么填充因子 100 最好最小化索引的物理大小,但对于更新频繁的表,较小的填充因子更好地最小化页面拆分的需要。其他索引方法以不同但大致相似的方式使用填充因子;默认填充因子因方法而异。

  • 回复:“如果表是静态的,那么填充因子 100 最好是最小化索引的物理大小,但对于大量更新的表,较小的填充因子可以更好地减少页面拆分的需要。” 试图了解“大量更新的表”的上下文 - 这是否意味着行值被大量更新的表,或者可能还包括经常插入和/或删除的行的表?我想知道我的表(对行值几乎没有更改,但进行了大量插入和删除)是否可以从其主要(键)索引上的较低填充因子中受益。 (2认同)