索引和性能将小桌子移动到大桌子中的意义

时间:2013-06-18 22:38:32

标签: sql postgresql indexing

我有一个大约有250万行的表,我正考虑进入一个更大的表,3500万行,并在原来的250万行上设置一个布尔标志。

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

3 个答案:

答案 0 :(得分:2)

或许看一下使用partial index

来自文档

  

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

     

部分索引的主要动机是避免索引常见   值。由于查询搜索公共值(一个帐户   超过所有表行的百分之几)将不会使用   无论如何,索引中的那些行没有任何意义   所有。这会减小索引的大小,从而加快查询速度   那个确实使用索引。它还将加速许多表更新   操作,因为索引不需要在所有情况下更新。   例11-1显示了这个想法的可能应用。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

但是,如果行中有很多流失,那么最终" true"行和" false"行将变得混乱,使用索引越来越少有效,PostgreSQL将停止使用它。

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

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