是否可以在复合类型的某个字段上有索引?例如,假设我创建了一个类型
CREATE TYPE complex AS (
r double precision,
i double precision
);
并且想要({特别是Hash / GIST / GIN)索引超过r
而一个超过i
,这是可能的吗?
同样,是否有可能在数组字段的第一个,第二个,第三个......元素上有索引?
假设我使用complex[]
,是否可以在所有complex[0]
上覆盖所有complex[1]
,等等。
答案 0 :(得分:22)
是的,绝对可能。使用index on an expression。棘手的部分是syntax for composite types。
复杂类型元素的B树索引:
CREATE TABLE tbl (tbl_id serial, co complex);
CREATE INDEX tbl_co_r_idx ON tbl (((co).r)); -- note the parentheses!
SQL Fiddle与EXPLAIN ANALYZE
。
同样的事情适用于数组的元素,即使对于复合类型的数组:
CREATE TABLE tbl2 (tbl2_id serial, co complex[]);
CREATE INDEX tbl2_co1_idx ON tbl2 ((co[1])); -- note the parentheses!
请注意,如果表达式或多或少地按字面匹配,则表达式索引只能用于查询。
但是你提到的 GIN 索引没有意义。 Per documentation:
GIN代表广义倒置指数。 GIN专为。而设计 处理要编制索引的项目是复合值的情况,以及 索引要处理的查询需要搜索元素 复合项目中出现的值。
GIN索引在复杂类型整数的数组中是有意义的,让你在其中搜索一个元素。但是您需要针对特定类型的实现。这是一个list of examples in standard Postgres(除了对所有一维数组的基本支持)。