PostgreSQL为hstore布尔属性编制索引

Bor*_*oso 2 postgresql indexing hstore

我有一个名为extras的hstore列,我已经定义了许多属性,其中一些是布尔值,我想索引它们中的一些,例如extras->'delivered'在这种情况下,这将是索引其中一些属性的最佳方法.

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

感谢名单.

Cra*_*ger 6

在一个单独的索引键hstore字段

当前hstore版本没有键入值.所有的价值都是text.因此,您无法直接在hstore值上定义"boolean"索引.但是,您可以将值转换boolean为转换表达式并将其转换为索引.

CREATE INDEX sometable_extras_delivered_bool 
ON sometable ( ((extras->'delivered')::boolean) );
Run Code Online (Sandbox Code Playgroud)

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

对于hstore字段,此b-tree索引的创建和维护效率低于直接在表中的boolean col的b-tree索引.查询将大致相同.

索引的所有键的hstore字段

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

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

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

重新考虑您的数据模型

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

您可以存储键入的值json,但是您没有获得可用的GIN/GiST索引支持hstore.这将在9.4或9.5中得到改进,其中hstore 2添加了对类型化,嵌套,可索引的hstores的支持,并且在其上构建了新的json表示.

部分索引

对于布尔值,您可能还需要考虑部分索引表达式,其中布尔值是另一个索引的谓词,而不是实际的索引列.例如:

CREATE INDEX sometable_ids_delivered ON sometable(id) WHERE (delivered);
Run Code Online (Sandbox Code Playgroud)

或者,对于hstore字段:

CREATE INDEX sometable_ids_delivered ON sometable(id) WHERE ((extras->'delivered')::boolean);
Run Code Online (Sandbox Code Playgroud)

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