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

nav*_*ige 7 postgresql indexing types

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

CREATE TYPE complex AS (
    r       double precision,
    i       double precision
);
Run Code Online (Sandbox Code Playgroud)

并希望有一个(特别是哈希/ GIST/GIN)指数超过r一个i,这可能吗?

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

假设我使用complex[],是否可以在所有complex[0],包括所有complex[1],等等上有索引.

Erw*_*ter 24

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

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

CREATE TABLE tbl (tbl_id serial, co complex);

CREATE INDEX tbl_co_r_idx ON tbl (((co).r)); -- note the parentheses!
Run Code Online (Sandbox Code Playgroud)

SQL拨弄EXPLAIN ANALYZE.
同样的事情适用于数组的元素,即使对于复合类型的数组:

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

CREATE INDEX tbl2_co1_idx ON tbl2 ((co[1])); -- note the parentheses!
Run Code Online (Sandbox Code Playgroud)

请注意,表达式索引只能在表达式或多或少字面匹配时用于查询.

但是就像你提到的GIN索引那样没有意义.每个文件:

GIN代表广义倒置指数.GIN用于处理要编制索引的项目是复合值的情况,索引要处理的查询需要搜索复合项目中出现的元素值.

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