与 postgresql 中的 btree 索引相比,brin 索引如何处理非时态数据?

How brin index performs on non temporal data when compared with btree index in postgresql?

我正在阅读以下博客 post 与时间数据上的 btree 相比,带来索引性能。

https://info.crunchydata.com/blog/postgresql-brin-indexes-big-data-performance-with-minimal-storage

问题:

  1. 我想知道 brin 索引的使用仅限于像 timestampz 这样的时间数据,或者它可以用于非时间数据,比如在列上定义 brin 索引让我们说 user_id .

  2. 何时使用 b-tree 索引与 brin 索引?

任何指点将不胜感激。谢谢。

只要是支持B树索引的数据类型,即全序数据类型(任意两个值都可以比较),都可以使用BRIN索引。

但是您几乎从不使用 BRIN 索引。它们仅在 table 中行的物理顺序与您正在索引的列值的逻辑顺序相同或完全相反时才有效。

因此,使用整数,以下 table 就可以:

+--------------+----------------+------
|1 4 6 7 12 14 | 17 16 29 31 44 | ...
+--------------+----------------+------
   8kB block       8kB block

观察排序并不完美:值为 17 的行在值为 16 的行之前。但它足够接近,不会干扰块范围内的最小值和最大值(默认为 128 个块).

但是,如果每个块范围只有一个离群值,则 BRIN 索引将变得无用。

因此,您只能在仅插入 tables 上使用这些索引,其中插入的行具有索引列(时间序列的典型值)的不断增加(或减少)的值,或者如果您可以以正确的顺序(数据仓库)人为地重写 table。