PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Index multicolonne sur 3 champs avec des types de données hétérogènes

Index à une seule colonne

Postgres peut combiner plusieurs index très efficacement dans une seule requête grâce aux balayages d'index bitmap . La plupart du temps, l'index le plus sélectif est sélectionné (ou deux, combinés avec des balayages d'index bitmap) et le reste est filtré. Une fois que l'ensemble de résultats est suffisamment restreint, il n'est plus efficace d'analyser plus d'index.

Index multicolonne

Il est encore plus rapide d'avoir un index multicolonne parfaitement correspondant, mais pas par ordre de grandeur.
Puisque vous souhaitez inclure un type de tableau Je suggère d'utiliser un GIN indice. AFAIK, les classes d'opérateurs sont manquantes pour les index GiST à usage général sur le type de tableau. (L'exception étant intarray pour integer tableaux.)

Pour inclure l'integer colonne, installez d'abord le module supplémentaire btree_gin , qui fournit les classes d'opérateurs GIN nécessaires. Exécuter une fois par base de données :

CREATE EXTENSION btree_gin;

Ensuite, vous devriez pouvoir créer votre index multicolonne :

CREATE INDEX tbl_abc_gin_idx ON tbl USING GIN(a, b, c);

L'ordre des colonnes d'index n'a pas d'importance pour les index GIN. Le manuel :

Un index GIN multicolonne peut être utilisé avec des conditions de requête qui impliquent n'importe quel sous-ensemble des colonnes de l'index. Contrairement à B-tree ou GiST, l'efficacité de la recherche d'index est la même quelle que soit la ou les colonnes d'index utilisées par les conditions de requête.

Recherche du voisin le plus proche

Puisque vous incluez une geometry PostGis type, il y a de fortes chances que vous souhaitiez effectuer une recherche du plus proche voisin, pour laquelle vous avez besoin d'un GiST indice. Dans ce cas, je suggère deux index :

CREATE INDEX tbl_ac_gist_idx ON tbl USING GiST(a, c);  -- geometry type
CREATE INDEX tbl_bc_gin_idx  ON tbl USING GIN(b, c);

Vous pouvez ajouter le integer colonne c à l'un ou aux deux. Cela dépend. Pour cela, vous avez besoin soit de btree_gin ou btree_gist ou les deux, respectivement.