0

我有一个大约有 250 万行的表,我正在考虑将它移到一个更大的表中,即 3500 万行,并在原来的 250 万行上设置一个布尔标志。

如果我想对新的更大表中的 250 万条记录运行大量查询,添加索引是否有用/不会导致对每个查询进行全表扫描?我知道传统上的索引对布尔值没有帮助,但由于只有 7% 的记录是真实的,我认为它可能不需要对每个查询进行表扫描。

4

3 回答 3

2

也许看看使用部分索引

来自文档

部分索引是建立在表的子集上的索引;子集由条件表达式(称为部分索引的谓词)定义。索引仅包含满足谓词的那些表行的条目。

部分索引的主要动机是避免索引公共值。由于搜索公共值(占所有表行的百分之几)的查询无论如何都不会使用索引,因此将这些行保留在索引中根本没有意义。这会减小索引的大小,从而加快使用索引的查询。它还将加快许多表更新操作,因为不需要在所有情况下都更新索引。例 11-1 展示了这个想法的一个可能的应用。

于 2013-06-18T22:44:38.760 回答
0

如果您想要有效访问大部分表,我会考虑分区。

于 2013-06-18T22:54:44.280 回答
0

如果您执行“insert into big select * from small”,那么来自小表的所有行都可能在物理上彼此靠近。分析完表后,PostgreSQL 会知道这一点,因此可能会选择使用布尔值上的索引。

但是,如果行中有大量流失,那么最终“真”行和“假”行将变得混乱,使索引的使用越来越不有效,PostgreSQL 将停止使用它。

通过使用分区/继承,您可以保持行在物理上是分开的(以便对小数据集进行更快的顺序扫描),同时在需要时使它们看起来像单个数据集。

根据您运行的查询的性质,您还可能受益于将其他列添加到索引中,将布尔列保持为第一列。

于 2013-06-19T23:39:57.463 回答