PostgreSQL为hstore布尔属性编制索引

时间:2013-12-29 18:21:37

标签: postgresql indexing hstore

我有一个名为 extras 的hstore列,我已经定义了许多属性,其中一些属于boolean,我想将其中一些属性编入索引,例如extras->'delivered'是索引其中一些属性的最佳方式。

如果您回答,可以告诉我您的技术是否适用于小数或其他类型。

感谢名单。

1 个答案:

答案 0 :(得分:6)

hstore字段

中的单个键编制索引

当前的hstore版本没有输入值。所有值均为text。因此,您无法直接在hstore值上定义“boolean”索引。但是,您可以将值强制转换为boolean并将转换表达式编入索引。

CREATE INDEX sometable_extras_delivered_bool 
ON sometable ( ((extras->'delivered')::boolean) );

只有使用表达式(extras->'delivered')::boolean)的查询才能从索引中受益。如果索引表达式使用强制转换,则查询表达式也必须使用。

hstore字段上的这个b-tree索引的创建和维护效率低于表中直接的b​​oolean col的b-tree索引。查询它将大致相同。

索引hstore字段

中的所有密钥

如果您想要一个索引所有 hstore密钥的通用索引,则只能将它们编入索引为text。 PostgreSQL 9.3中的hstore不支持值输入。 请参阅indexes on hstore

如果您事先不知道需要索引哪些键,这将非常有用。

(稍后用户在使用与json兼容的hstore版本2编写PostgreSQL版本时预发布会发现他们的hstore支持键入值。

重新考虑您的数据模型

坦率地说,如果您在hstore中的字段上创建了您认为是布尔值的索引,那么请考虑重新考虑您的数据模型。你最好把这个布尔值作为包含hstore的表的普通字段。

您可以在json中存储键入的值,但是您无法获得hstore可用的GIN / GiST索引支持。这将在9.4或9.5中得到改进,hstore 2增加了对类型化,嵌套,可索引的hstores的支持,并且在此基础上构建了一个新的json表示。

部分索引

对于布尔值,您可能还需要考虑partial index expressions,其中布尔值是另一个索引的谓词,而不是实际的索引列。 E.g:

CREATE INDEX sometable_ids_delivered ON sometable(id) WHERE (delivered);

或者,对于hstore字段:

CREATE INDEX sometable_ids_delivered ON sometable(id) WHERE ((extras->'delivered')::boolean);

究竟什么是最好的取决于您的查询。