Extensions PostgreSQL pour la performance

Module X2

Dalibo SCOP

24.09

29 août 2024

Sur ce document

Formation Module X2
Titre Extensions PostgreSQL pour la performance
Révision 24.09
PDF https://dali.bo/x2_pdf
EPUB https://dali.bo/x2_epub
HTML https://dali.bo/x2_html
Slides https://dali.bo/x2_slides
TP https://dali.bo/x2_tp
TP (solutions) https://dali.bo/x2_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.

Extensions PostgreSQL pour la performance

PostgreSQL

Préambule

Ce module présente des extensions plus spécifiquement destinées à améliorer les performances.

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);

pg_stat_statements

Capture en temps réel des requêtes

  • Normalisation
  • Indicateurs :
    • nombre d’exécutions,
    • nombre d’enregistrements retournés
    • temps cumulé d’exécution et d’optimisation
    • lectures/écritures en cache, demandées au système, tris
    • temps de lecture/écriture (track_io_timing)
    • écritures dans les journaux de transactions (v13)
    • temps de planning (désactivé par défaut, v13)
    • utilisation du JIT (v15)

pg_stat_statements : mise en place

shared_preload_libraries = 'pg_stat_statements'
CREATE EXTENSION pg_stat_statements ; -- dans 1 ou plusieurs bases
SELECT * FROM pg_stat_statements ;
  • Vue en mémoire partagée (volumétrie contrôlée)
  • Pas d’échantillonnage, seulement des compteurs cumulés
    • pg_stat_statements_reset() ou PoWA

pg_stat_statements : exemple 1

Requêtes les plus longues en temps cumulé :

SELECT r.rolname, d.datname, s.calls, s.total_exec_time,
       s.total_exec_time / s.calls AS avg_time, s.query
  FROM pg_stat_statements s
  JOIN pg_roles r     ON (s.userid=r.oid)
  JOIN pg_database d  ON (s.dbid = d.oid)
 ORDER BY s.total_exec_time DESC
 LIMIT 10 ;

pg_stat_statements : exemple 2

Requêtes les plus fréquemment appelées :

SELECT r.rolname, d.datname, s.calls, s.total_exec_time,
       s.total_exec_time / s.calls  AS avg_time, s.query
  FROM pg_stat_statements s
  JOIN pg_roles r     ON (s.userid=r.oid)
  JOIN pg_database d  ON (s.dbid = d.oid)
 ORDER BY s.calls DESC
 LIMIT 10;

pg_stat_statements : exemple 3

Requêtes les plus consommatrices et hit ratio :

SELECT calls, total_exec_time, rows,
       100.0*shared_blks_hit
       /nullif(shared_blks_hit+shared_blks_read, 0) AS "hit %",
       query
FROM  pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 5 ;

auto_explain

  • Tracer les plans des requêtes lentes automatiquement
  • Contrib officielle
  • Mise en place globale (traces) :
    • globale :
    shared_preload_libraries='auto_explain'   -- redémarrage !
    ALTER DATABASE erp SET auto_explain.log_min_duration = '3s' ;
    • session :
    LOAD 'auto_explain' ;
    SET auto_explain.log_analyze TO true;

pg_buffercache

Qu’y a-t’il dans le cache de PostgreSQL ?

Fournit une vue :

  • Pour chaque page (donc pour l’ensemble de l’instance)
    • fichier (donc objet) associé
    • OID base
    • fork (0 : table, 1 : FSM, 2 : VM)
    • numéro de bloc
    • isdirty
    • usagecount

pg_prewarm

  • Charge des blocs en cache :
-- cache de PG
SELECT pg_prewarm ('pgbench_accounts', 'buffer') ;
-- cache de Linux (asynchrone)
SELECT pg_prewarm ('pgbench_accounts', 'prefetch') ;
-- cache (tous OS)
SELECT pg_prewarm ('pgbench_accounts', 'read') ;
  • Ne pas oublier les index !
  • N’interdit pas l’éviction
  • Récupération du cache au redémarrage (v11)
    • avec un petit paramétrage

Langages procéduraux

  • Procédures & fonctions en différents langages
  • Par défaut : SQL, C et PL/pgSQL
  • Extensions officielles : Perl, Python
  • Mais aussi Java, Ruby, Javascript…
  • Intérêts : fonctionnalités, performances

Avantages & inconvénients

  • PL/pgSQL plus performant pour l’accès aux données
  • Chaque langage a son point fort
  • Performances :
    • latence (pas d’allers-retours)
    • accès aux données depuis les fonctions
    • bibliothèques de chaque langage
    • index
  • Langages trusted / untrusted

hll

  • COUNT(DISTINCT) est notoirement lent
  • Principe d’HyperLogLog :
    • travail sur des hachages, avec perte
    • estimation statistique
    • non exact, mais beaucoup plus rapide
  • Exemple :
SELECT mois, hll_cardinality(hll_add_agg(hll_hash_text( id )))
FROM voyages ;
  • Type hll pour pré-agréger des données

Quiz

Travaux pratiques

Indexation de pattern avec les varchar_patterns et pg_trgm

auto_explain

pg_stat_statements

PL/Python, import de page web et compression

PL/Perl et comparaison de performances

hll

Travaux pratiques (solutions)