12

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

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

并且想要一个(尤其是哈希/GIST/GIN)索引超过r一个i,这可能吗?

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

假设我使用complex[], 是否有可能对 all complex[0]、 over allcomplex[1]等进行索引?

4

1 回答 1

33

是的,绝对有可能。使用表达式索引。棘手的部分是复合类型的语法

复杂类型元素上的 B 树索引:

CREATE TABLE tbl (tbl_id serial, co complex);

CREATE INDEX tbl_co_r_idx ON tbl (((co).r)); -- note the parentheses!

db<>fiddle here - 使用EXPLAIN ANALYZE
sqlfiddle

同样的事情适用于数组的预定元素(不适用于整个数组!),即使对于复合类型的数组也是如此:

CREATE TABLE tbl2 (tbl2_id serial, co complex[]);

CREATE INDEX tbl2_co1_idx ON tbl2 ((co[1])); -- note the parentheses!

请注意,如果表达式或多或少在字面上匹配,则表达式索引只能用于查询。

但这对于您提到的GIN索引没有意义。手册

GIN 代表广义倒排索引。GIN 设计用于处理要索引的项目是复合值的情况,并且要由索引处理的查询需要搜索出现在复合项目中的元素值。

GIN 索引对整个复杂类型的数组是有意义的,让您可以在其中搜索元素。但是您需要针对您的特定类型的实现。这是标准 Postgres 中的示例列表(除了对所有一维数组的基本支持)。

于 2013-02-23T13:34:11.003 回答