让我们做几个假设:
我有一个看起来像这样的表:
a | b
---+---
a | -1
a | 17
...
a | 21
c | 17
c | -3
...
c | 22
Run Code Online (Sandbox Code Playgroud)
关于我的套装的事实:
整个表的大小是 ~ 10 10行。
我有 ~ 100k 行,列中有值a,a其他值类似(例如c)。
这意味着在“a”列中有大约 100k 个不同的值。
我的大多数查询都会读取 a 中给定值的全部或大部分值,例如select sum(b) from t where a = 'c'.
该表的编写方式使得连续值在物理上接近(要么按顺序写入,要么我们假设CLUSTER已在该表和列上使用a)。
该表很少更新,我们只关心读取速度。
该表相对较窄(比如每个元组约 25 个字节,+ 23 个字节的开销)。
现在的问题是,我应该使用什么样的索引?我的理解是:
BTree我的问题是 BTree 索引会很大,因为据我所知它会存储重复值(它必须这样做,因为它不能假设表是物理排序的)。如果 BTree 很大,我最终不得不读取索引和索引指向的表部分。(我们可以使用fillfactor = 100来稍微减小索引的大小。)
BRIN …
postgresql performance index clustered-index postgresql-9.6 query-performance