Un moteur de bases de données est composé de plusieurs parties, ne serait-ce qu'au niveau des requêtes : un analyseur syntaxique, un planificateur, un exécuteur. Le planificateur est certainement l'un des composants les plus importants : de ses capacités vont dépendre les performances du moteur. Un mauvais plan peut rapidement ralentir tout un système, alors qu'un bon plan permettra à la fois de bonnes performances et une grande interaction des différentes sessions. Cet article va tenter d'expliquer le planificateur de PostgreSQL, ses capacités, ses points forts, comme ses points faibles, pour permettre à tout un chacun de comprendre pourquoi telle requête utilise tel plan d'exécution.
1. Schéma et données de tests
Commençons par créer une base, y créer une table et lui ajouter quelques données :
$ psql postgres
psql (9.3.3)
Type "help" for help.
postgres=# CREATE DATABASE planif;
CREATE DATABASE
postgres=# \c planif
You are now connected to database "planif" as user "guillaume".
planif=# CREATE TABLE t1 (c1 integer, c2 text);
CREATE TABLE
planif=# ALTER TABLE t1 SET (autovacuum_enabled=off);
ALTER TABLE
planif=# INSERT INTO t1
planif-# SELECT i, md5(random()::text) FROM generate_series(1, 1000000) AS i;
INSERT 0 1000000
La commande ALTER TABLE sert à désactiver l'autovacuum sur la table, le but étant de contrôler quand nous allons faire un ANALYZE ou un VACUUM sur cette table. Le reste des commandes est suffisamment simple pour ne pas nécessiter d'explications.
2. Parcours de table
On va continuer avec la requête la plus simple possible, une extraction de toutes les données d'une table :
- Accédez à tous les contenus de Connect en illimité
- Découvrez des listes de lecture et des contenus Premium
- Consultez les nouveaux articles en avant-première