小编foo*_*foo的帖子

对大量重复值使用什么索引?

让我们做几个假设:

我有一个看起来像这样的表:

 a | b
---+---
 a | -1
 a | 17
  ...
 a | 21
 c | 17
 c | -3
  ...
 c | 22
Run Code Online (Sandbox Code Playgroud)

关于我的套装的事实:

  • 整个表的大小是 ~ 10 10行。

  • 我有 ~ 100k 行,列中有值aa其他值类似(例如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

15
推荐指数
2
解决办法
8735
查看次数