Postgres 索引大小计算

maa*_*aax 4 postgresql performance index index-tuning

在创建索引之前,有什么方法可以粗略估计索引的大小(在磁盘上)?表和每列的大小是已知的。我对索引特别感兴趣GIN。此外,了解不同索引类型的大小如何彼此相关的任何信息。是否有一个一般的经验法则,比如GIN索引总是大于B-TREE索引?或者它是否太依赖于数据大小和分布?

澄清一下:我不是在寻找工具。我很高兴用手做。

jja*_*nes 6

没有通用的方法可以回答这个问题(除了在测试服务器上尝试并查看)。GIN 支持许多不同的运算符,例如 tsvector 或 trigrams,并且它们具有不同的特性。在较新的版本中,GIN 索引使用压缩,当相同的键值一遍又一遍地出现时,这会令人印象深刻。但压缩级别取决于行的顺序。

例如,如果我对包含大量重复值的单个文本列(使用btree_ginGIN 扩展,约 5000 万行,约 150 万个不同值)建立索引,我将获得 2010 MB 的 B 树索引和 435 MB 的空间为 GIN 索引。所以不,GIN 并不总是更大。但一般来说(即除了 btree_gin 之外),您不会像使用 b-tree 那样使用 GIN 索引相同类型的数据,因此直接比较大小没有多大意义。