我有一个名为 extras 的hstore列,我已经定义了许多属性,其中一些属于boolean,我想将其中一些属性编入索引,例如extras->'delivered'
是索引其中一些属性的最佳方式。
如果您回答,可以告诉我您的技术是否适用于小数或其他类型。
感谢名单。
答案 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索引的创建和维护效率低于表中直接的boolean 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);
究竟什么是最好的取决于您的查询。