PostgreSQL:为复合类型中的字段创建索引?

时间:2013-02-23 11:41:16

标签: postgresql types indexing

是否可以在复合类型的某个字段上有索引?例如,假设我创建了一个类型

CREATE TYPE complex AS (
    r       double precision,
    i       double precision
);

并且想要({特别是Hash / GIST / GIN)索引超过r而一个超过i,这是可能的吗?

同样,是否有可能在数组字段的第一个,第二个,第三个......元素上有索引?

假设我使用complex[],是否可以在所有complex[0]上覆盖所有complex[1],等等。

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 FiddleEXPLAIN 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(除了对所有一维数组的基本支持)。