@Tregoreg a soulevé une question dans le commentaire sur sa prime offerte:
Je n'ai pas trouvé les réponses actuelles fonctionnelles. L'utilisation de l'index GIN sur une colonne de type tableau n'augmente pas les performances de l'opérateur ANY (). N'y a-t-il vraiment pas de solution?
@ La réponse acceptée de Frank vous indique d'utiliser des opérateurs de tableau , ce qui est toujours correct pour Postgres 11. Le manuel:
... la distribution standard de PostgreSQL inclut une classe d'opérateurs GIN pour les tableaux, qui prend en charge les requêtes indexées à l'aide de ces opérateurs:
<@
@>
=
&&
La liste complète des classes d'opérateurs intégrées pour les index GIN dans la distribution standard se trouve ici.
Dans Postgres, les index sont liés à des opérateurs (qui sont implémentés pour certains types), pas à des types de données seuls ou à des fonctions ou autre. C'est un héritage de la conception Berkeley originale de Postgres et il est très difficile de changer maintenant. Et cela fonctionne généralement très bien. Voici un fil de discussion sur pgsql-bugs avec Tom Lane commentant cela.
Certaines fonctions PostGis (comme ST_DWithin()
) semblent enfreindre ce principe, mais ce n'est pas le cas. Ces fonctions sont réécrites en interne pour utiliser les opérateurs respectifs .
L'expression indexée doit être à gauche de l'opérateur. Pour la plupart des opérateurs ( y compris tout ce qui précède ), le planificateur de requêtes peut y parvenir en inversant les opérandes si vous placez l'expression indexée à droite - étant donné que a COMMUTATOR
a été défini. La ANY
construction peut être utilisée en combinaison avec divers opérateurs et n'est pas un opérateur en soi. Lorsqu'ils sont utilisés comme constant = ANY (array_expression)
seuls index prenant en charge l' =
opérateur sur les éléments du tableau, ils sont qualifiés et nous aurions besoin d'un commutateur pour = ANY()
. Les index GIN sont sortis.
Postgres n'est actuellement pas assez intelligent pour en dériver une expression indexable GIN. Pour commencer, constant = ANY (array_expression)
n'est pas complètement équivalent à array_expression @> ARRAY[constant]
. Les opérateurs de tableau renvoient une erreur si des éléments NULL sont impliqués, tandis que la ANY
construction peut traiter NULL de chaque côté. Et il existe différents résultats pour les incohérences de types de données.
Réponses connexes:
À part
Lorsque vous travaillez avec des integer
tableaux ( int4
, pas int2
ou int8
) sans NULL
valeurs (comme votre exemple l'indique), considérez le module supplémentaire intarray
, qui fournit des opérateurs spécialisés et plus rapides et un support d'index. Voir:
Quant à la UNIQUE
contrainte dans votre question qui est restée sans réponse: elle est implémentée avec un index btree sur toute la valeur du tableau (comme vous le soupçonniez) et n'aide pas du tout à la recherche d' éléments . Détails:
jsonb
et d'utiliser les index? postgresql.org/docs/9.5/static/functions-json.html et postgresql.org/docs/9.5/static/datatype-json.html#JSON-INDEXING