@Tregoreg a soulevé un question dans le commentaire de son offre de prime :
Je n'ai pas trouvé les réponses actuelles efficaces. L'utilisation d'un index GIN sur une sur une colonne de type tableau n'augmente pas les performances de l'opérateur ANY() n'augmente pas les performances de l'opérateur ANY(). N'y a-t-il vraiment pas de solution ?
@Frank's accepted réponse vous dit d'utiliser opérateurs de tableau qui est toujours correct pour Postgres 11. Le manuel :
... la distribution standard de PostgreSQL inclut un opérateur GIN pour les tableaux, qui supporte les requêtes indexées en utilisant ces opérateurs :
<@
@>
=
&&
La liste complète des classes d'opérateurs intégrés pour les index GIN dans la distribution standard est ici.
Dans Postgres les index sont liés à des opérateurs (qui sont mises en œuvre pour certains types), et non les types de données seuls ou les fonctions ou quoi que ce soit d'autre. C'est un héritage de la conception Berkeley originale de Postgres et très difficile à changer maintenant. Et cela fonctionne généralement très bien. Voici un fil de discussion sur pgsql-bugs avec Tom Lane qui commente ce sujet.
Quelques PostGis <em>fonctions </em>(comme <a href="https://postgis.net/docs/ST_DWithin.html" rel="noreferrer"><code>ST_DWithin()</code></a> ) semblent violer ce principe, mais ce n'est pas le cas. Ces fonctions sont réécrites en interne pour utiliser les fonctions respectives de <em>opérateurs </em>.
L'expression indexée doit être au 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é qu'un COMMUTATOR
a été défini. Le site ANY
construire peut être utilisé en combinaison avec divers opérateurs et n'est pas un opérateur en soi. Lorsqu'il est utilisé comme constant = ANY (array_expression)
seuls les index supportant le =
opérateur sur éléments du tableau serait qualifié et nous aurions besoin d'un commutateur pour = ANY()
. Les indices GIN sont sortis.
Postgres n'est actuellement pas assez intelligent pour en dériver une expression indexable par GIN. Pour commencer, constant = ANY (array_expression)
est pas complètement équivalentes a array_expression @> ARRAY[constant]
. Les opérateurs de tableau renvoient une erreur si un NULL est présent. éléments sont impliqués, tandis que les ANY
construct peut traiter avec NULL de chaque côté. Et il y a des résultats différents pour les incompatibilités de type de données.
Réponses connexes :
En dehors de
Tout en travaillant avec integer
tableaux ( int4
pas int2
o int8
) sans NULL
(comme votre exemple l'implique), considérez le module supplémentaire intarray
qui fournit des opérateurs spécialisés et plus rapides ainsi qu'un support d'index. Voir :
Quant à la UNIQUE
contrainte dans votre question qui est restée sans réponse : C'est implémenté avec un index btree sur l'objet gamme complète (comme vous le soupçonniez) et ne contribue pas à la recherche de éléments du tout. Détails :
0 votes
Est-il possible d'utiliser le type de données
jsonb
et utiliser les index ? postgresql.org/docs/9.5/static/functions-json.html y postgresql.org/docs/9.5/static/datatype-json.html#JSON-INDEXING