我有一个包含数亿行的表,其架构如下所示。
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)
答案 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扫描”)可能确实要快得多。
当您尝试使用该语句时,该表有多少行? 查询是怎么样的?也许还有其他条件阻止索引使用。 您是否分析了表格以获得最新统计数据?