2013-02-23 45 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