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.