postgresql中位图索引的替代方法

时间:2010-09-29 18:33:59

标签: postgresql

我有一个包含数亿行的表,其架构如下所示。

tabe AA {
 id integer primay key,
 prop0 boolean not null,
 prop1 boolean not null,
 prop2 smallint not null,
 ...
}

每个“属性”字段(prop0,prop1,...)具有少量不同的值。我通常会查询属性字段的给定条件中的“id”。我认为Bitmap索引最适合此查询。但是postgresql似乎不支持位图索引。

我在每个字段上尝试了b-tree索引,但根据查询说明不使用这些索引。

有没有一种很好的替代方法呢?

(我正在使用postgresql 9)

3 个答案:

答案 0 :(得分:4)

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

BIT数据类型也可能有用,只有check the manual

答案 1 :(得分:1)

在始终或几乎总是查询的属性上创建multicolumn index。或者如果需要,可以使用多个多列索引。

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

prop0=true
prop1=false
prop2=4

将是

'propzero nopropone proptwo4'::tsvector

使用GIN对其进行索引,然后使用全文搜索进行搜索:

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

答案 2 :(得分:0)

索引仅在实际加速查询时使用,而查询并非总是如此。特别是对于小型表(比如数千行),全表扫描(Postgres执行计划中的“seq扫描”)可能确实要快得多。

当您尝试使用该语句时,该表有多少行? 查询是怎么样的?也许还有其他条件阻止索引使用。 您是否分析了表格以获得最新统计数据?