2013-02-23 46 views
6

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

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

,并想在r一剩i有一个(尤其是散/ GIST/GIN)指数,那会是可能的吗?

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

假设我用complex[],有可能有一个指数在所有complex[0],在所有complex[1]

+1

高级索引使用情况,可能是迁移到[dba.SE](http://dba.stackexchange.com/)的候选人。 – 2013-02-23 13:50:00

回答

17

是的,绝对有可能的。使用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专为 处理要索引的项目为复合值的情况而 由索引处理的查询需要搜索组合项目中出现的元素 值。

杜松子酒指数才有意义复杂类型阵列上作为一个整体,让你搜索中的元素。但是您需要针对您的特定类型实施。这是一个list of examples in standard Postgres(除了对所有一维数组的基本支持外)。

+0

感谢您的详细和良好的答案!也感谢关于_GIN_的提示,你完全正确! – navige 2013-02-23 13:44:34