Indexation avancée

Module J5

Dalibo SCOP

24.09

29 août 2024

Sur ce document

Formation Module J5
Titre Indexation avancée
Révision 24.09
PDF https://dali.bo/j5_pdf
EPUB https://dali.bo/j5_epub
HTML https://dali.bo/j5_html
Slides https://dali.bo/j5_slides
TP https://dali.bo/j5_tp
TP (solutions) https://dali.bo/j5_solutions

Licence Creative Commons CC-BY-NC-SA

Cette formation est sous licence CC-BY-NC-SA. Vous êtes libre de la redistribuer et/ou modifier aux conditions suivantes :

  • Paternité
  • Pas d’utilisation commerciale
  • Partage des conditions initiales à l’identique

Marques déposées

PostgreSQL® Postgres® et le logo Slonik sont des marques déposées par PostgreSQL Community Association of Canada.

Versions de PostgreSQL couvertes

Ce document ne couvre que les versions supportées de PostgreSQL au moment de sa rédaction, soit les versions 12 à 16.

Indexation avancée

PostgreSQL

Index Avancés

De nombreuses fonctionnalités d’indexation sont disponibles dans PostgreSQL :

  • Index B-tree
    • multicolonnes
    • fonctionnels
    • partiels
    • couvrants
  • Classes d’opérateurs
  • Indexation GIN, GiST, BRIN, hash, bloom
  • Indexation de motifs
  • Indexation multicolonne

Index B-tree (rappels)

  • Index B-tree fonctionnel, multicolonne, partiel, couvrant :
    • requête cible :
    SELECT col4 FROM ma_table
    WHERE col3<12 and f(col1)=7 and col2 LIKE 'toto%' ;
    • index dédié :
    CREATE INDEX idx_adv ON ma_table (f(col1), col2 varchar_pattern_ops)
    INCLUDE (col4) WHERE col3<12 ;
  • Rappel : un index est coûteux à maintenir !

Index GIN

Un autre type d’index

  • Définition
  • Utilisation avec des données non structurées
  • Utilisation avec des données scalaires
  • Mise à jour

GIN : définition & données non structurées

GIN : Generalized Inverted iNdex

  • Index inversé généralisé
    • les champs sont décomposés en éléments (par API)
    • l’index associe une valeur à la liste de ses adresses
  • Pour chaque entrée du tableau
    • liste d’adresses où le trouver
  • Utilisation principale : données non scalaires
    • tableaux, listes, non structurées…

GIN et les tableaux

Quels tableaux contiennent une valeur donnée ?

  • Opérateurs : @>, <@, =, &&, ?, ?|, ?&
SELECT * FROM matable WHERE a @> ARRAY[42] ;
CREATE INDEX ON tablo USING gin (a);
  • Champs concaténés : transformer en tableaux
SELECT * FROM voitures
WHERE regexp_split_to_array(caracteristiques,',')
          @> '{"toit ouvrant","climatisation"}'  ;
CREATE INDEX idx_attributs_array ON voitures
USING gin ( regexp_split_to_array(caracteristiques,',') ) ;

GIN pour les JSON et les textes

  • JSON :
    • opérateur jsonb_path_ops ou jsonb_ops
  • Indexation de trigrammes
    • extensions pg_trgm (opérateur dédié gin_trgm_ops)
  • Recherche Full Text
    • indexe les vecteurs

GIN & données scalaires

  • Données scalaires aussi possibles
    • avec l’extension btree_gin
  • GIN compresse quand les données se répètent
    • alternative à bitmap !

GIN : mise à jour

  • Création lourde
    • maintenance_work_mem élevé
  • Mise à jour lente
    • d’où l’option fastupdate
    • … à désactiver si temps de réponse instable !

Index GiST

GiST : Generalized Search Tree

  • Arbre de recherche généralisé
  • Indexation non plus des valeurs mais de la véracité de prédicats
  • Moins performants que B-tree (moins sélectifs)
  • Moins lourds que GIN

GiST : cas d’usage

Le GiST indexe à peu près n’importe quoi

  • géométries (PostGIS)
  • intervalles, adresses IP, FTS…

D’autres usages recouvrent en partie ceux de GIN.

GiST & KNN

  • KNN = K-Nearest neighbours (K-plus proches voisins)
    • c’est-à-dire :
    SELECT
    ORDER BY ma_colonne <-> une_référence LIMIT 10 ;
  • Très utile pour la recherche de mots ressemblants, géographique
    • Exemple :
    SELECT   p, p <-> point(18,36)
    FROM     mes_points
    ORDER BY p <-> point(18, 36)
    LIMIT    4 ;

GiST & Contraintes d’exclusion

Contrainte d’exclusion : une extension du concept d’unicité

  • Unicité :
    • n-uplet1 = n-uplet2 interdit dans une table
  • Contrainte d’exclusion :
    • n-uplet1 op n-uplet2 interdit dans une table

    • op est n’importe quel opérateur indexable par GiST

    • Exemple :

    CREATE TABLE circles
        ( c circle,
          EXCLUDE USING gist (c WITH &&));
    • Exemple : réservations de salles

GIN, GiST & pg_trgm

  • Indexation des recherches LIKE '%critère%'

  • Similarité basée sur des trigrammes

CREATE EXTENSION pg_trgm;
SELECT similarity('bonjour','bnojour');

 similarity
------------
   0.333333
  • Indexation (GIN ou GiST) :
CREATE INDEX test_trgm_idx ON test_trgm
  USING gist (text_data gist_trgm_ops);

Indexation multicolonne : GIN, GiST & bloom

  • Multicolonne dans n’importe quel ordre
  • GIN ou GiST
    • extensions btree_gist ou btree_gin
  • Ou bloom ?
  • Quel est le meilleur ?
    • ça dépend…

Index BRIN

BRIN : Block Range INdex

CREATE INDEX brin_demo_brin_idx ON brin_demo USING brin (age)
WITH (pages_per_range=16) ;
  • Valeurs corrélées à leur emplacement physique
  • Calcule des plages de valeur par groupe de blocs
    • index très compact
  • Pour :
    • grosses volumétries
    • corrélation entre emplacement et valeur
    • penser à CLUSTER

Index hash

  • Basés sur un hash
  • Tous types de données, quelle que soit la taille
  • Ne gèrent que =
    • donc ni <>, !=
  • Mais plus compacts
  • Ne pas utiliser avant v10 (non journalisés)

Outils

  • Pour identifier des requêtes
  • Pour identifier des prédicats et des requêtes liées
  • Pour valider un index

Identifier les requêtes

  • pgBadger
  • pg_stat_statements
  • PoWA

Identifier les prédicats et des requêtes liées

  • Extension pg_qualstats
    • avec PoWa

Extension HypoPG

  • Extension PostgreSQL
  • Création d’index hypothétiques pour tester leur intérêt
    • avant de les créer pour de vrai
  • Limitations : surtout B-Tree, statistiques

Étude des index à créer

  • PoWA peut utiliser HypoPG

Quiz

Travaux pratiques

Tous les TP se basent sur la configuration par défaut de PostgreSQL, sauf précision contraire.

Indexation de motifs avec les varchar_patterns et pg_trgm

Index GIN comme bitmap

Index GIN et critères multicolonnes

HypoPG

Travaux pratiques (solutions)