postgresql中位图索引的替代方案

postgresql中位图索引的替代方案,postgresql,Postgresql,我有一个包含数亿行的表,模式如下 tabe AA { id integer primay key, prop0 boolean not null, prop1 boolean not null, prop2 smallint not null, ... } 每个“属性”字段(prop0、prop1,…)都有少量不同的值。我通常通过查询从属性字段的给定条件中查找“id”。我认为位图索引最适合这个查询。但postgresql似乎不支持位图索引 我在每个字段上尝试了b树索引,但根据查询说明

我有一个包含数亿行的表,模式如下

tabe AA {
 id integer primay key,
 prop0 boolean not null,
 prop1 boolean not null,
 prop2 smallint not null,
 ...
}
每个“属性”字段(prop0、prop1,…)都有少量不同的值。我通常通过查询从属性字段的给定条件中查找“id”。我认为位图索引最适合这个查询。但postgresql似乎不支持位图索引

我在每个字段上尝试了b树索引,但根据查询说明,这些索引没有被使用

有没有其他好的方法可以做到这一点


(我使用的是postgresql 9)

您真正的问题是糟糕的模式设计,而不是索引。属性应放在不同的表中,并且当前表应使用多对多关系链接到该表


位数据类型也可能有用,只是。

只有当索引确实加快了查询速度时才使用索引,但情况并非总是如此。特别是对于较小的表(比如数千行),完整表扫描(Postgres执行计划中的“seq scan”)可能确实要快得多

当您尝试该语句时,表有多少行? 这个查询看起来怎么样?可能还有其他条件阻止索引的使用。 您是否分析了该表以获得最新的统计信息?

在总是或几乎总是被查询的属性上创建一个表。如果需要,也可以使用多个多列索引

当您几乎不总是查询相同的属性时,另一种方法是创建一个tsvector列,其中包含描述数据的单词,例如使用触发器维护

prop0=true
prop1=false
prop2=4
会是

'propzero nopropone proptwo4'::tsvector
使用GIN为其编制索引,然后使用全文搜索进行搜索:

where tsv @@ 'popzero & nopropone & proptwo4'::tsquery

正如我上面提到的,行的数量是数亿。我通常会“从AA中选择id,其中prop0=true,prop1=false,prop2=3和…”。我分析了表格以更新统计数据。你能发布执行计划吗?理想情况下,解释分析的输出?真/假值是如何分布的?如果选择了所有行的20%以上,则seq扫描通常比索引查找快。因此,如果prop0=true yield包含所有行的值,那么使用索引没有任何好处。如果您总是使用所有列,那么在这些列上创建一个复合索引可能比为每个属性创建一个索引更有意义。所有属性都是相互正交的。所以如果我规范化N个属性,那么就会有N个表。你的意思是我应该把N个属性分组成m个组,并制作m个表,这是组成员的排列,然后将AA表链接到这m个表以增加每个字段的基数?不,我是说你需要一个表“properties”、“AA”和“properties\u AA”。最后一个表只保存属性和aa表之间的关系。这个表将是巨大的,但可以索引。布尔值几乎不可能建立索引,您只有3个选项:NULL、FALSE和TRUE。表properties_aa中的id是更好的候选者。