Bonnes Pratiques Postgresql
Bonnes Pratiques Postgresql
et optimisation
Janvier 2022
Table des
matières
Objectifs 5
Introduction 7
Contenus annexes 27
3
Objectifs
5
Introduction
7
Installation du
I -
I
serveur
PostgreSQL/Post
GIS
Fondamental
Le paramétrage du serveur PostgreSQL est enregistré dans le fichier de
configuration [Link]
Seul l'administrateur du serveur peut changer les paramètres du serveur et
modifier le fichier [Link]
Le serveur PostgreSQL doit être relancé pour appliquer les modifications de
configuration
nb : pour le MTES se reporter aux conseils pour le déploiement de l'offre Eole
PostgreSQL1
Cette mesure de sécurité basique est surtout conseillée dans le cadre d'une
ouverture vers le web.
Méthode
Dans le fichier de configuration [Link], changer la valeur port=5432
1 - [Link]
9
Installation du serveur PostgreSQL/PostGIS
Attention : le modifier à posteriori pour une base ne sera pris en compte que pour
les nouveaux éléments (tables, index...) de la base.
Pour changer le tablespace sur ceux-ci, il vous faut modifier le tablespace de chacun
des éléments (table, index).
Exemple : Créer un tablespace sur une autre partition que la partition système :
Sous LINUX : CREATE TABLESPACE espace_rapide LOCATION
'/mnt/sda1/postgresql/data';
Sous WINDOWS : CREATE TABLESPACE espace_rapide LOCATION
'E:/sda1/postgresql/data';
Remarque :
On peut aussi modifier le paramètre default_tablespace dans le fichier
[Link]
Ex : default_tablespace = '/mnt/sda1/postgresql/data'
10
Installation du serveur PostgreSQL/PostGIS
Cette action très importante est à mettre en œuvre dès la phase de conception de la
base de données
Elle permet de :
Séparer le coeur de PostGIS (tables systèmes PostGIS, fonctions...) des
données elles-mêmes
Organiser les données par la création de schémas par thématique métier , ou
selon d'autres organisations (référentiel, données tabulaires/vectorielles etc)
Simplifier potentiellement la gestion des droits d'utilisation par cette
organisation en schémas multiples
Le principal avantage reste néanmoins de faciliter la mise à jour de PostGIS ainsi que
la restauration et l'échange plus efficaces de données.
L'import d'une sauvegarde contenant les fonctionnalités PostGIS dans une autre
installation peut en effet causer des conflits.
11
Paramétrage du
II -
II
serveur
PostgreSQL pour
l'exploitation des
données spatiales
Fondamental
Le paramétrage du serveur PostgreSQL est enregistré dans 2 fichiers de
configuration dont le fichier [Link]
Seul l'administrateur du serveur peut changer les paramètres du serveur et
modifier le fichier [Link]
Le serveur PostgreSQL doit être relancé pour appliquer les modifications de
configuration
Mode opératoire
PostgreSQL est une base de données capable de fonctionner dans des
environnements ayant des ressources très limitées et partageant ces ressources avec
un grand nombre d'autres applications.
Afin d'assurer que PostgreSQL tournera convenablement dans ces environnements, la
configuration par défaut est très peu consommatrice de ressources mais inadaptée
pour des bases de données spatiales.
Nous allons voir comment configurer le serveur PostgreSQL pour optimiser son
fonctionnement pour l'exploitation des données spatiales en modifiant quelques
paramètres importants dans le fichier [Link].
13
Paramétrage du serveur PostgreSQL pour l'exploitation des
données spatiales
Paramètres à modifier
Important :
Les valeurs recommandées ci-dessous pour chaque paramètre de configuration
constituent un bon point de départ pour améliorer sensiblement le fonctionnement du
serveur pour l'exploitation des données spatiales, mais elles doivent être testées et
ajustées pour chaque configuration matérielle du serveur informatique, notamment
par rapport à la mémoire vive disponible.
shared_buffers (integer)
Initialise la quantité de mémoire que le serveur de bases de données utilise comme
mémoire partagée.
La valeur par défaut, en général 128kB, est insuffisante pour une base de données
spatiales en production.
Si vous disposez d'un serveur dédié à la base de données, avec 1 Go de mémoire ou
plus, une valeur de départ raisonnable pour ce paramètre est de 25% de la mémoire
du système.
PostgreSQL profite aussi du cache du système d'exploitation, il est donc peu probable
qu'une allocation de plus de 40% de la mémoire fonctionnera mieux qu'une valeur
plus restreinte.
Valeur recommandée : 512MB (en fait 1/4 de la mémoire totale de la machine)
work_mem (integer)
Indique la quantité de mémoire que les opérations de tri interne et les tables de
hachage (relations données/empreintes ou signatures des données) peuvent utiliser
avant de basculer sur des fichiers disque temporaires.
La valeur par défaut est de 1MB.
Pour une requête complexe, il peut y avoir plusieurs opérations de tri ou de hachage
exécutées en parallèle ; chacune peut utiliser de la mémoire à hauteur de cette
valeur avant de commencer à placer les données dans des fichiers temporaires sur le
disque.
De plus, de nombreuses sessions peuvent exécuter de telles opérations
simultanément. La mémoire totale utilisée peut, de ce fait, atteindre plusieurs fois la
valeur de work_mem.
2 - [Link]
14
Paramétrage du serveur PostgreSQL pour l'exploitation
des données spatiales
Il faut considérer combien de connexions et quelle complexité est attendue dans les
requêtes avant d'augmenter cette valeur.
Le bénéfice acquis par l'augmentation de cette valeur est que la plupart des
opérations de classification, dont les clauses ORDER BY et DISTINCT, les jointures,
les agrégations basées sur les hachages et l'exécution de requête imbriquées,
pourront être réalisées sans avoir à passer par un stockage sur disque.
Valeur recommandée : 16MB (on peut mettre plus, par exemple 128MB pour une
mémoire totale de 24 Go RAM)
maintenance_work_mem (integer)
Indique la quantité maximale de mémoire que peuvent utiliser les opérations de
maintenance telles que VACUUM, CREATE INDEX et ALTER TABLE ADD FOREIGN KEY.
La valeur par défaut est de 16MB.
Puisque seule une de ces opérations peut être exécutée à la fois dans une session et
que, dans le cadre d'un fonctionnement normal, peu d'opérations de ce genre sont
exécutées concurrentiellement sur une même installation, il est possible d'initialiser
cette variable à une valeur bien plus importante que work_mem.
Une grande valeur peut améliorer les performances des opérations VACUUM et de la
restauration des sauvegardes.
Valeur recommandée : 128MB (256MB à 1GB pour une mémoire totale de 24 Go
RAM)
wal_buffers (integer)
Définit la quantité de mémoire partagée utilisée pour les données des journaux de
transactions qui n'ont pas encore été écrites sur disque.
Elle indique que les informations, pour annuler les effets d'une opération sur un
objet, doivent être écrites dans le journal en mémoire stable avant que l'objet
15
Paramétrage du serveur PostgreSQL pour l'exploitation des
données spatiales
checkpoint_segments (integer)
Nombre maximum de journaux de transaction entre deux points de vérification
automatique des WAL (chaque segment fait normalement 16 Mo).
Cette valeur définit le nombre maximum de segments des journaux (typiquement
16MB) qui doit être rempli entre chaque point de reprise WAL.
Un point de reprise WAL est une partie d'une séquence de transactions pour lequel on
garantit que les fichiers de données ont été mis à jour avec toutes les requêtes
précédant ce point.
À ce moment-là toutes les pages sont repérées sur le disque et les points de reprise
sont écrits dans le fichier de journal.
Cela permet au processus de reprise après défaillance de trouver les derniers points
de reprise et de récupérer l'état des données avant la défaillance.
Étant donné que les points de reprise nécessitent un repérage de toutes le pages
ayant été modifiées sur le disque, cela va créer une charge d'entrées/sorties
significative.
Le même argument que précédemment s'applique ici pour les données spatiales.
Augmenter cette valeur limitera le nombre de points de reprise, mais impliquera un
redémarrage plus lent en cas de défaillance.
La valeur par défaut est de 3 segments.
Dans les phases d'import de référentiel volumineux ou les opérations de
remontée de dump conséquent, ce qui constitue la grosse part du travail a
l'initialisation de la base le paramètre peut être porté à beaucoup plus (exemple
128*16MB soir 2 GB). Cela signifie que postgres n'exécute pas l'écriture physique
tant qu'il n'a pas atteint 2GB de donnés à écrire. Ceci afin de ne pas faire travailler
les disques pour des petites opérations en usage courant mais bien par block de
tâche à exécuter. Par ailleurs, même si 2GB ne sont pas écrits, si le paramètre
checkpoint_timeout est par défaut à 5min, postgresql écrira soit tous les 2GB soit
toutes les 5 minutes, le premier de l'un des deux termes atteint.
Valeur recommandée : 10 (et jusqu'à 128 pour 24 Go de RAM totale, en particulier
en cas d’imports volumineux).
16
Paramétrage du serveur PostgreSQL pour l'exploitation
des données spatiales
effective_cache_size (integer)
Initialise l'estimation faite par le planificateur de la taille réelle du cache disque
disponible pour une requête.
Ce paramètre est lié à l'estimation du coût d'utilisation d'un index : une valeur
importante favorise les parcours d'index, une valeur faible les parcours séquentiels.
Ce paramètre n'a pas d'influence sur la taille de la mémoire partagée allouée par
PostgreSQL et ne réserve pas non plus le cache disque du noyau, il n'a qu'un rôle
estimatif. Le système ne suppose pas non plus que les données reste dans le cache
du disque entre des requêtes.
La valeur par défaut est de 128MB.
Valeur recommandée : 512MB (peut être porté à 2/3 de la RAM totale pour un
serveur dédié).
Journalisation
Il est recommandé d'activer le journal des opérations.
Attention cependant car le fichier de log doit être analysé et nettoyé régulièrement.
logging_collector = on
17
Paramétrage du serveur PostgreSQL pour l'exploitation des
données spatiales
3 - [Link]
4 - [Link]
18
Bonnes pratiques
III -
III
de sécurité
Bien gérer les utilisateurs (users) et les groupes (rôles) permet de bien
sécuriser ses bases, tant contre l'intrusion que contre les erreurs de
manipulation.
Les accès peuvent se gérer à plusieurs niveaux (base de données, schéma, table,
tablespace, function...).
On peut autoriser à un utilisateur (à tous les niveaux) :
La lecture (select) : droit de consulter les données
L'écriture (insert) : droit de créer de nouvelles données
La modification (update) : droit de modifier des données existantes
La suppression (delete) : droit de supprimer des données
La création de clés primaires / étrangères (references) : droit de créer des
clés primaires et étrangères.
La création de triggers (trigger) : droit de créer des triggers. Un trigger est
une fonction qui se déclenche lors d'un événement prédéfini.
L'utilisation des rôles et des droits associés permet de gérer de manière très fine les
accès et les utilisateurs, permettant ainsi d'assurer l'intégrité des données.
Typiquement, les données de référence seront en lecture seule (sauf pour le ou les
administrateurs SIG) et les données métier seront lisibles uniquement pour les
services concernés.
La définition des groupes et rôles est réalisée au niveau du serveur par
l’administrateur.
La conception de ces rôles et droits d'accès est aussi importante que la conception de
la base de données elle-même.
19
Bonnes pratiques de sécurité
ASGARD5 est une extension mettant à disposition des services qui proposent une
solution de gestion des droits intégrée qui, sans nécessiter de compétences avancées
sur PostgreSQL, qui, sans nécessiter de compétences avancées sur PostgreSQL, est
adaptée au contexte d'un serveur de données partagé, notamment du point de vue
de la sécurité .
5- [Link]
6- [Link]
7- [Link]
8- [Link]
20
Optimisation de la
IV -
IV
gestion de la base
de données
Une géométrie non valide est la cause principale de l'échec des requêtes spatiales.
La notion de validité de la géométrie et les méthodes pour corriger les géométries
non valides sont exposées dans le module 4 Compléments SQL - p.29
Un rapport9 plus général a été publié par le Pôle Progiciels géomatiques.
9 - [Link]
10 - [Link]
21
Optimisation de la gestion de la base de données
L'utilisation d'index est une façon habituelle d'améliorer les performances d'une base
de données.
Un index permet au serveur de bases de données de retrouver une ligne spécifique
bien plus rapidement qu'en parcourant séquentiellement la table.
Les index peuvent aussi bénéficier aux commandes UPDATE et DELETE comportant
des conditions de recherche.
De plus, les index peuvent être utilisés dans les jointures. Ainsi, un index défini sur
une colonne qui fait partie d'une condition de jointure peut aussi accélérer
significativement les requêtes avec jointures.
11 - [Link]
22
Optimisation de la gestion de la base de données
Mais les index ajoutent aussi une surcharge au système de base de données dans
son ensemble, si bien qu'ils doivent être utilisés avec discernement.
Après la création d'un index, le système doit le maintenir synchronisé avec la table.
Cela rend plus lourdes les opérations de manipulation de données.
C'est pourquoi les index qui sont peu, voire jamais, utilisés doivent être supprimés.
Attention : la présence d'index ralentit très fortement l'insertion donc il ne faut pas
en mettre lorsque cela n'est pas nécessaire.
Source documentaire : [Link] 12
12 - [Link]
23
Optimisation des
V -
V
requêtes SQL
Dans certains cas, l'utilisation de sous-requêtes est plus efficace que les multiples
conditions et jointures.
Il faut donc penser à tester l'utilisation de sous-requêtes, d'autant plus qu'elles
permettent de décomposer un problème complexe en plusieurs problèmes plus
simples
25
Optimisation des requêtes SQL
ST_Contains Oui
ST_ContainsProperl Oui
y
ST_Covers Oui
ST_CoveredBy Oui
ST_Crosses Oui
ST_Disjoint Non
ST_Equals Oui
ST_Intersects Oui
ST_Overlaps Oui
ST_Relate Non
ST_Touches Oui
ST_Within Oui
26
Optimisation des requêtes SQL
27
Contenus annexes
- Correction de géométrie
Une géométrie non valide est la cause principale de l'échec des requêtes spatiales.
Dans 90% des cas la réponse à la question “pourquoi mes requêtes me renvoient un
message d'erreur du type 'TopologyException error' est : “un ou plusieurs des
arguments passés sont invalides”. Ce qui nous conduit à nous demander : que
signifie invalide et pourquoi est-ce important ?
La validité est surtout importante pour les polygones, qui définissent des surfaces et
requièrent une bonne structuration.
Certaines des règles de validation des polygones semblent évidentes, et d'autres
semblent arbitraires (et le sont vraiment) :
Les contours des polygones doivent être fermés.
Les contours qui définissent des trous doivent être inclus dans la zone définie
par le contour extérieur.
Les contours ne doivent pas s'intersecter (ils ne doivent ni se croiser ni se
toucher).
Les contours ne doivent pas toucher les autres contours, sauf en un point
unique.
Les deux dernières règles font partie de la catégorie arbitraire.
PostGIS est conforme au standard OGC OpenGIS Specifications.
Les entités géométriques des bases PostGIS doivent ainsi être à la fois simples et
valides.
Par exemple, calculer la surface d'un polygone comportant un trou à l'extérieur ou
construire un polygone à partir d'une limite non simple n'a pas de sens.
Selon les spécifications de l'OGC, une géométrie simple est une géométrie qui ne
comporte pas de points géométriques anormaux, comme des auto-intersections ou
des auto-tangences, ce qui concerne essentiellement les points, les multi-points, les
polylignes et les multi-polylignes.
La notion de géométrie valide concerne principalement les polygones et les multi-
polygones et le standard définit les caractéristiques d'un polygone valide.
29
Contenus annexes
Une polyligne est simple si elle ne se recroise pas (les extrémités peuvent être
confondues, auquel cas c'est un anneau et la polyligne est close).
Les polylignes (a) et (c) sont simples, mais pas les polylignes (b) et (d)
Une multi-polyligne est simple si toutes les polylignes la composant sont elles-mêmes
simples et si les intersections existant entre 2 polylignes se situent à une extrémité
de ces éléments :
Un polygone est valide si ses limites, qui peuvent être constituées par un unique
anneau extérieur (polygone plein) ou par un anneau extérieur et un ou plusieurs
anneaux intérieurs (polygone à trous), ne comporte pas d'anneaux se croisant.
Un anneau peut intersecter la limite mais seulement en un point (pas le long d'un
segment).
Un polygone ne doit pas comporter de lignes interrompues (les limites doivent être
30
Contenus annexes
(h) et (i) sont des polygones valides, (j), (k), (l), (m) sont des polygones ni simples
ni valides mais (j) et (m) sont des multi-polygones valides
(n) et (o) ne sont pas des multi-polygones valides, par contre (p) est valide
Par défaut, PostGIS n'applique pas le test de validité géométrique lors de l'import
d'entités géométriques, parce que le test de validité géométrique consomme
beaucoup de temps processeur pour les géométries complexes, notamment les
polygones.
Il faut donc mettre en œuvre différentes méthodes pour vérifier la validité de la
géométrie des entités.
31
Contenus annexes
Exemple
Exemple :
Le polygone POLYGON((0 0, 0 1, 2 1, 2 2, 1 2, 1 0, 0 0)) n'est pas valide
32
Contenus annexes
- Détecter la validité
Dans l'exemple précédent nous avions un polygone que nous savions non-valide.
Comment déterminer les géométries non valides dans une table d'un million
d'enregistrements ?
Avec la fonction ST_IsValid(geometry) utilisée avec notre polygone précédent, nous
obtenons rapidement la réponse :
SELECT ST_IsValid(ST_GeometryFromText('POLYGON((0 0, 0 1, 1 1, 2 1, 2
2, 1 2, 1 1, 1 0, 0 0))'));
résultat : f (false)
Maintenant nous savons que la géométrie de l'entité n'est pas valide mais nous ne
savons pas pourquoi.
Nous pouvons utiliser la fonction ST_IsValidReason(geometry) pour trouver la cause
de non validité :
SELECT ST_IsValidReason(ST_GeometryFromText('POLYGON((0 0, 0 1, 1 1,
2 1, 2 2, 1 2, 1 1, 1 0, 0 0))'));
résultat : Self-intersection[1 1]
En plus de la cause d'invalifdité (auto-intersection), la localisation de la non validité
(coordonnée (1 1)) est aussi renvoyée.
Nous pouvons aussi utiliser la fonction ST_IsValid(geometry) pour tester les tables
comme dans l'exemple suivant :
SELECT ST_IsValidReason(geom) FROM [Link] WHERE Not
ST_IsValid (geom);
33
Contenus annexes
34
Contenus annexes
qui renvoi :
35
Contenus annexes
Complément
A la recherche d'une requête universelle...
La requête suivante permet de prendre en compte des cas de figure où
ST_MakeVAlid() transforme des objets en collection de (multi)polygones,
(multi)polyliges, ou (multi)point.
C'est le cas si, par exemple on part d'une couche avec un polygone comprenant un
arc qui deviendra avec ST_Makevalid() une collection d'un polygone et d'une
polyligne.
On peut utiliser :
update ma_table SET geom =
ST_Multi(ST_CollectionExtract(st_simplify(ST_ForceCollection(ST_MakeValid(geom)),
0),3))
st_simplify(geometry,0) permet de supprimer les nœuds en double.
ST_ForceCollection() permet de forcer le résultat comme une collection, même si
St_MakeValid() ne produit pas de collection, afin de pouvoir utiliser après
St_CollectionExtract()
On utilise ST_CollectionExtract(geometry,3) pour ne retenir dans cet exemple que
les polygones de la collection.
et ST_Multi() pour forcer le résultat en multipolygones, même s'il n'y a qu'un seul
polygone extrait.
36
Contenus annexes
Enfin pour ne pas simplifier inutilement des objets (par exemple linéaire dans notre
exemple ou l'on recherche des polygones) on utilisera finalement la requête
suivante :
update ma_table SET geom =
st_multi(ST_Simplify(ST_Multi(ST_CollectionExtract(ST_ForceCollection(ST_MakeVali
d(geom)),3)),0)) WHERE ST_GeometryType(geom) like ' %Polygon' and
St_invalid(geom)
Constater que les parties de polygones en jaune ont disparu en particulier pour les
polygones en 'papillons'.
La méthode avec st_buffer(geom, 0) est donc une alternative, si la méthode
st_makevalid() échoue (gros jeu de données), mais elle ne doit être utilisée que si on
a déjà corrigé les polygones en ‘papillons'
Il est fortement conseillé de noter le nombre d'objets de la couche avant et après
traitement pour une première vérification de pertinence.
Complément
Il existe l'algorithme Réparer les géométries dans Processing (menu traitement).
Nous n'avons abordé ici que la problématique des géométries invalides au sens de
l'osgeo. Mais il peut exister d'autres motif de correction comme des incohérences
entres polygones d'une même couche (dépend des spécifications de saisie), comme
des recouvrements (partiels ou non), des trous, des petits polygones (scories),...
Il existe d'autres solutions pour experts, comme l'utilisation de fonctions de GRASS
([Link] et [Link]) . Le plugin vérificateur de géométrie 13 qui est une extension
principale de QGIS est désormais relativement stable (QGIS 3 et plus) et intéressant.
Voir la documentation14 de QGIS.
13 - [Link]
14 - [Link]
15 - [Link]
37
Contenus annexes
16 - [Link]
17 - [Link]
18 - [Link]
38
Contenus annexes
Nous verrons qu'il est possible de réaliser les requêtes SQL à l'aide des assistants
sous PgAdminIII et vérifier la syntaxe SQL dans le dernier onglet de l'assistant :
Une contrainte de clé étrangère stipule que les valeurs d'une colonne (ou d'un groupe
de colonnes) doivent correspondre aux valeurs qui apparaissent dans les lignes d'une
autre table. On dit que cela maintient l'intégrité référentielle entre les deux tables.
Si nous reprenons notre exemple Propriétaire / véhicule.
Si on considère qu'un véhicule doit toujours avoir un propriétaire préalablement
existant, on peut déclarer :
CREATE TABLE vehicule (
numeroserie VARCHAR(20) PRIMARY KEY,
type VARCHAR(20),
19 - [Link]
20 - [Link]
39
Contenus annexes
marque VARCHAR(20),
id_proprietaire SMALLINT REFERENCE proprietaire(id)
)
Lors de la saisie d'un nouveau véhicule, le système vérifiera que l'id saisie dans
id_proprietaire existe bien dans la table proprietaire.
Une table peut contenir plusieurs contraintes de clé étrangère. Les relations n-m
entre tables sont implantées ainsi (voir par exemple l'extrait de la formation de
Stéphane Crozat à partir d'ici21).
voir également la documentation de PostgreSQL22.
Méthode : VACUUM
VACUUM récupère l'espace inutilisé et, optionnellement, analyse une base.
VACUUM récupère l'espace de stockage occupé par des lignes mortes. Lors des
opérations normales de PostgreSQL, les lignes supprimées ou rendues obsolètes par
une mise à jour ne sont pas physiquement supprimées de leur table. Elles restent
présentes jusqu'à ce qu'un VACUUM soit lancé. C'est pourquoi, il est nécessaire de
faire un VACUUM régulièrement, spécialement sur les tables fréquemment mises à
jour.
Sans paramètre, VACUUM traite toutes les tables de la base de données courante
pour lequel l'utilisateur connecté dispose du droit d'exécution du VACUUM. Avec un
paramètre, VACUUM ne traite que cette table.
Les options :
FULL récupère plus d'espace (compactage des tables), mais est beaucoup
plus long et prend un verrou exclusif sur la table (inaccessible à d'autres
21 - [Link]
22 - [Link]
40
Contenus annexes
Méthode : ANALYZE
ANALYZE24 collecte des statistiques sur le contenu des tables de la base de données
et stocke les résultats dans le catalogue système pg_statistic25.
L'optimiseur de requêtes les utilise pour déterminer les plans d'exécution les plus
efficaces.
ANALYZE peut être exécuté comme une option de VACUUM.
Méthode : REINDEX
REINDEX reconstruit un index en utilisant les données stockées dans la table,
remplaçant l'ancienne copie de l'index. Il y a plusieurs raisons pour utiliser
REINDEX :
Un index a été corrompu et ne contient plus de données valides
L'index en question a « explosé », c'est-à-dire qu'il contient beaucoup de
pages d'index mortes ou presque mortes
23 - [Link]
24 - [Link]
25 - [Link]
41
Contenus annexes
Méthode : CLUSTER
CLUSTER commande permet de réécrire les données d'une table dans un ordre
donné (suivant un index). Cela peut être utile pour optimiser des requêtes SQL, selon
la façon dont les données sont accédées.
Pour des tables spatiales, elle permet d'ordonner physiquement la table selon l'index
géométrique et permet donc un accès aux enregistrements "proches" plus rapide.
Attention toutefois : cette opération reste lourde puisqu'elle pause un verrou exclusif
sur la table traitée (aucune autre action possible sur la table durant ce temps).
26 - [Link]
27 - [Link]
28 - [Link]
29 - [Link]
42
Contenus annexes
Seq scan : indique que le moteur SQLde PostgreSQL execute un balayage séquentiel
sur la table FR_communes
startup cost : est le coût estimé de lancement
Total cost : est le coût estimé du scan (les coûts sont estimés en unité arbitraire30)
Plan rows : indique que 5 lignes sont retournées
Plan width : longueur estimée en octets
EXPLAIN fourni des données estimées.
On peut exécuter EXPLAIN ANALYZE qui lui va exécuter la requête et fournir les coûts
30 - [Link]
43
Contenus annexes
mesurés
Le moteur de PostgreSQL commence par balayer la table d'index sur le statut pour
un coût de 4.94, puis balaye uniquement les enregistrements de la table
FR_communes correspondant à la condition sur statut pour un coût de 299.15 (coût
total) - 4.94 (coût du balayage de la table d'index).
Le coût total est de 299.15 et donc très inférieur au coût sans l'index.
Il se peut cependant que le planificateur n'utilise pas ce nouvel index dans votre cas
particulier.
en effet les index ne sont pas systématiquement utilisés. Voir la documentation
PostgreSQL31.
31 - [Link]
44
Contenus annexes
Si on survole l'icône finale à droite, on constate que le coût global est maintenant de
82.21
Le planificateur a choisi une stratégie :
1. balayage de l'index sur le champ Nom_Région en 57.66
2. balayage de l'index id_commune en 4.93
3. ET (Bitmap And) entre les deux résultats ci-dessus en 0
4. balayage des lignes de la table FR_Communes correspondantes en ajoutant le
filtre sur le Statut en (82.21- 62.84) = 19.77
Pour un total de 82.21.
Le planificateur aurait pu choisir une autre stratégie en inversant le rôle d'un ou de
deux des index. Il base sa stratégie sur les données statistiques qu'il maintient sur
les tables.
Une commande VACCUM ANALYZE que l'on peut lancer sur la base stageXX à partir
du menu Outils -> Maintenance
permet de remettre à jour les statistiques sur les tables.
45
Contenus annexes
créer un index qui porte sur les champs statut et Nom_Région et Code_commune :
46
Contenus annexes
Complément
EXPLAIN fourni des temps estimés, EXPLAIN ANALYZE fourni les temps observés
(exécute la requête), ce qui est beaucoup plus précis mais coûteux en temps.
Il est également possible d'avoir plus de détails avec EXPLAIN ANALYZE VERBOSE
ou directement en SQL :
explain analyze verbose select * from travail."FR_communes" where
"Code_Commune" = '023' and "Statut" = 'Commune simple' and "Nom_Région"
= 'AQUITAINE'
qui renvoi :
"Index Scan using id_composite on travail."FR_communes" (cost=0.41..18.13
rows=5 width=442) (actual time=0.024..0.032 rows=5 loops=1)"
" Output: id, geom, "Code_Commune", "INSEE_Commune", "Nom_Commune",
"Statut", "Population", "Superficie", "Altitude_Moyenne", "Code_Canton",
"Code_dpt_arr_can", "Code_Arrondissement", "Code_dpt_arr", "Code_Département",
"Nom_Département", "Code_Région", "Nom_Région""
" Index Cond: ((("FR_communes"."Statut")::text = 'Commune simple'::text) AND
(("FR_communes"."Nom_Région")::text = 'AQUITAINE'::text) AND
(("FR_communes"."Code_Commune")::text = '023'::text))"
"Planning time: 0.104 ms"
"Execution time: 0.056 ms"
Complément
PostgreSQL permet de mettre dans le fichier de log, les requêtes ayant plus pris plus
d'un certain temps. Cette option se configure via l'entrée
log_min_duration_statement du fichier de configuration PostgreSQL.
A noter également un site 32qui permet de mettre en exergue les parties les plus
coûteuses d'un plan d'analyse.
Dalibo propose PEV233 qui est utilisable en ligne34 ou en téléchargement.
On trouvera également des explications très détaillées sur ce site35 avec par exemple
la description des opérations36 des plans d'analyse.
32 - [Link]
33 - [Link]
34 - [Link]
35 - [Link]
36 - [Link]
47
Contenus annexes
48