2013-02-23 5 views
6

Est-il possible d'avoir un index sur un certain champ d'un type composite? On suppose, par exemple, je crée un typePostgreSQL: Créer un index pour les champs dans un type composite?

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

et je voudrais avoir un index (en particulier Hash/GIST/GIN) sur r et un sur i, serait-ce possible?

De même, est-il possible d'avoir un index sur le premier, le deuxième, le troisième, ... élément d'un champ de tableau?

On suppose que j'utilise complex[], serait-il possible d'avoir un index de toutes complex[0], sur toute complex[1], etc.

+1

Utilisation avancée de l'index, peut être un candidat pour la migration vers [dba.SE] (http://dba.stackexchange.com/). –

Répondre

17

Oui, tout à fait possible. Utilisez un index on an expression. La partie difficile est le syntax for composite types.

index B-tree sur un élément d'un type complexe:

CREATE TABLE tbl (tbl_id serial, co complex); 

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

SQL Fiddle avec EXPLAIN ANALYZE.
Même chose fonctionne pour les éléments d'un tableau, même pour un tableau de type composite:

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

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

Notez que l'expression index ne peut être utilisé pour les requêtes si l'expression est mis en correspondance plus ou moins littéralement.

Mais cela n'a aucun sens avec un index GIN comme vous l'avez mentionné. Per documentation:

GIN est l'abréviation de Generalized Inverted Index. GIN est conçu pour la gestion des cas où les éléments à indexer sont des valeurs composites, et les requêtes à traiter par l'index doivent rechercher l'élément valeurs qui apparaissent dans les éléments composites.

Un index GIN serait logique sur un tableau de type complexe comme tout, pour vous permettre de rechercher un élément à l'intérieur. Mais vous avez besoin d'une implémentation pour votre type particulier. Voici un list of examples in standard Postgres (en plus du support de base pour tous les tableaux unidimensionnels).

+0

Merci pour votre réponse très détaillée et bonne! Merci également pour l'indice concernant _GIN_, vous êtes complètement là! – navige

Questions connexes