Bases de données PostgreSQL

Transcription

Bases de données PostgreSQL
Bases de données
PostgreSQL
Gestion des performances
Gregory Smith
Traduit de l’anglais par
Guillaume Lelarge et Thomas Reiss
© 2011 Pearson Education France – Bases de données PostgreSQL – Gregory Smith
Book_PostgreSQL.indb 1
18/04/11 17:35
Pearson Education France a apporté le plus grand soin à la réalisation de ce livre afin de vous
fournir une information complète et fiable. Cependant, Pearson Education France n’assume de
responsabilités, ni pour son utilisation, ni pour les contrefaçons de brevets ou atteintes aux droits
de tierces personnes qui pourraient résulter de cette utilisation.
Les exemples ou les programmes présents dans cet ouvrage sont fournis pour illustrer les descriptions
théoriques. Ils ne sont en aucun cas destinés à une utilisation commerciale ou professionnelle.
Pearson Education France ne pourra en aucun cas être tenu pour responsable des préjudices
ou dommages de quelque nature que ce soit pouvant résulter de l’utilisation de ces exemples ou
programmes.
Tous les noms de produits ou marques cités dans ce livre sont des marques déposées par leurs
­propriétaires respectifs.
Publié par Pearson Education France
47 bis, rue des Vinaigriers
75010 PARIS
Tél. : 01 72 74 90 00
www.pearson.fr
Collaboration éditoriale : Hervé Guyader
Mise en pages : Léa B.
ISBN : 978-2-7440-2483-2
Copyright © 2011 Pearson Education France
Tous droits réservés
Titre original : PostgreSQL 9.0 High
Performance
Traduit de l’anglais par Guillaume Lelarge
et Thomas Reiss
ISBN original : 978-1-849510-30-1
Copyright © 2010 Packt Publishing
All rights reserved
Aucune représentation ou reproduction, même partielle, autre que celles prévues à l’article L. 122-5 2˚ et 3˚ a)
du code de la propriété intellectuelle ne peut être faite sans l’autorisation expresse de Pearson Education
France ou, le cas échéant, sans le respect des modalités prévues à l’article L. 122-10 dudit code.
All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means,
electronic or mechanical, including photocopying, recording or by any information storage retrieval system,
without permission from Pearson Education, Inc.
© 2011 Pearson Education France – Bases de données PostgreSQL – Gregory Smith
Book_PostgreSQL.indb 2
18/04/11 17:35
Table des matières
à propos des auteurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XVII
à propos des traducteurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XIX
Préface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Ce que ce livre couvre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Ce dont vous avez besoin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
À qui s’adresse ce livre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Conventions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1
PostgreSQL et ses versions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
Performances des versions de PostgreSQL . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Choix d’une version à utiliser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Mise à jour vers une version majeure . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
PostgreSQL ou une autre base de données ? . . . . . . . . . . . . . . . . . . . . . . . . . 10
Les outils autour de PostgreSQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Les contributions PostgreSQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
pgFoundry . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Autres logiciels liés à PostgreSQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Montée en charge d’une application PostgreSQL . . . . . . . . . . . . . . . . . . . . 15
Pratique de l’optimisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Résumé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
© 2011 Pearson Education France – Bases de données PostgreSQL – Gregory Smith
Book_PostgreSQL.indb 3
18/04/11 17:35
IV
2
Bases de données PostgreSQL
Matériel pour la base de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Équilibrer les dépenses en matériel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Processeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
Mémoire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
Disques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Contrôleurs disque . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
Amélioration de la fiabilité des contrôleurs et des disques . . . . . . . . . . . . . 34
Cache write-back . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
Conséquences d’un cache write-through
sur les performances . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Résumé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
3
Tests de performance du matériel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Tests des processeurs et de la mémoire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
memtest86+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Tests mémoires STREAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
Tests des processeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Les sources de lenteur des processeurs
et de la mémoire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
Tests des disques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
Accès aléatoire et entrées/sorties par seconde . . . . . . . . . . . . . . . . . . . . 48
Accès séquentiel et ZCAV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
Taux de COMMIT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
Outils de test pour les disques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
hdtune . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
dd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
bonnie++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .57
sysbench . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
Tests complexes des disques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
Exemples de résultats pour les disques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
Attentes sur les performances des disques . . . . . . . . . . . . . . . . . . . . . . . 67
Résumé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
© 2011 Pearson Education France – Bases de données PostgreSQL – Gregory Smith
Book_PostgreSQL.indb 4
18/04/11 17:35
4
Table des matières
V
Configuration des disques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
Taille maximale des systèmes de fichiers . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
Restauration suite à un crash du système de fichiers . . . . . . . . . . . . . . . . . . 74
Systèmes de fichiers journalisés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Systèmes de fichiers Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
ext2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
ext3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
ext4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
XFS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
Autres systèmes de fichiers Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
Barrières d’écriture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
Configuration générique des systèmes de fichiers . . . . . . . . . . . . . . . . . 84
Systèmes de fichiers Solaris et FreeBSD . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
UFS sur Solaris . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
UFS2 sur FreeBSD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
ZFS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
Systèmes de fichiers Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
FAT32 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
NTFS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
Topologie des disques pour PostgreSQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
Liens symboliques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
Tablespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
Structure du répertoire des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
Grappes de disques, RAID et répartition . . . . . . . . . . . . . . . . . . . . . . . . 100
Résumé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
5
La mémoire comme cache pour la base de données . . . . . . . . . . . . . . . . . . . . 105
Unités mémoire dans le fichier postgresql.conf . . . . . . . . . . . . . . . . . . . . . . 106
Gestion des ressources du noyau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .107
Étude du cache de la base de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
Installation de pg_buffercache dans une base de données . . . . . . . . . . 111
Topologie de la base de données sur disque . . . . . . . . . . . . . . . . . . . . . . 112
© 2011 Pearson Education France – Bases de données PostgreSQL – Gregory Smith
Book_PostgreSQL.indb 5
18/04/11 17:35
VI
Bases de données PostgreSQL
Création d’un nouveau bloc dans la base de données . . . . . . . . . . . . . . 115
L’écriture des blocs modifiés sur le disque . . . . . . . . . . . . . . . . . . . . . . . 116
Protection des données et cache de données . . . . . . . . . . . . . . . . . . . . . . . . . 116
Principes du traitement des checkpoints . . . . . . . . . . . . . . . . . . . . . . . . . 116
Restauration par les journaux de transactions . . . . . . . . . . . . . . . . . . . . 117
Exécution des checkpoints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
Cycle de vie d’un bloc de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
Cache de données et cache du système d’exploitation . . . . . . . . . . . . . . . . 121
Données doublement cachées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
Surcharge due aux checkpoints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
Points de départ pour le dimensionnement . . . . . . . . . . . . . . . . . . . . . . . 124
Analyse du contenu du cache de données . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
Requêtes pour inspecter le cache disque . . . . . . . . . . . . . . . . . . . . . . . . . 126
Résumé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
6
Configuration du serveur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
Modification de la configuration à la volée . . . . . . . . . . . . . . . . . . . . . . . . . . 134
Valeurs par défaut et valeurs de réinitialisation . . . . . . . . . . . . . . . . . . . 134
Contextes de modification des paramètres . . . . . . . . . . . . . . . . . . . . . . . 134
Recharger le fichier de configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
Paramètres au niveau serveur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
Connexions aux bases de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
max_connections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .139
Traces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
Nettoyage et collecte des statistiques . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
Checkpoints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
Configuration des journaux de transactions . . . . . . . . . . . . . . . . . . . . . . 147
PITR et réplication des journaux de transactions . . . . . . . . . . . . . . . . . 149
Paramètres clients . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
Paramètres à éviter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
© 2011 Pearson Education France – Bases de données PostgreSQL – Gregory Smith
Book_PostgreSQL.indb 6
18/04/11 17:35
Table des matières VII
Configuration initiale d’un serveur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
Les grandes lignes pour configurer un serveur dédié . . . . . . . . . . . . . . 155
Les grandes lignes pour configurer un serveur mutualisé . . . . . . . . . . 156
pgtune . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
Résumé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
7Maintenance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
Visibilité des transactions avec MVCC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
Calculs internes de visibilité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
Mises à jour . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
Verrous de lignes et conflits de verrouillage . . . . . . . . . . . . . . . . . . . . . 163
Suppressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
Avantages de MVCC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
Inconvénients de MVCC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
Rebouclage des identifiants de transactions . . . . . . . . . . . . . . . . . . . . . . 166
VACUUM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
Implémentation de VACUUM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
Modèle de coût pour le VACUUM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
autovacuum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
Problèmes courants avec VACUUM et autovacuum . . . . . . . . . . . . . . . 177
Autoanalyze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
Dégénérescence des index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
Mesurer la dégénérescence des index . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
Supervision détaillée des tables et index . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
Supervision des traces d’exécution des requêtes . . . . . . . . . . . . . . . . . . . . . 186
Configuration basique des traces de PostgreSQL . . . . . . . . . . . . . . . . . 186
Trace des requêtes lentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
Analyse des journaux de traces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
Normalisation des requêtes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
pg_stat_statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
© 2011 Pearson Education France – Bases de données PostgreSQL – Gregory Smith
Book_PostgreSQL.indb 7
18/04/11 17:35
Bases de données PostgreSQL
VIII
pgFouine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
PQA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
pgsi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
mk-query-digest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
Résumé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
8
Tests de performances des bases de données . . . . . . . . . . . . . . . . . . . . . . . . . . 201
Tests par défaut de pgbench . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
Définition des tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
Définition de l’échelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
Définition du script de requêtes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
Configuration du serveur de bases de données pour pgbench . . . . . . . 205
Exécuter pgbench manuellement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
Créer des graphes avec pgbench-tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
Configuration de pgbench-tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
Exemples de résultats avec pgbench . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
Tests d’extraction seule . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
Tests du type TPC-B . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
Analyse de la latence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
Sources de variation des performances et de mauvaises performances . . 214
Version en développement de PostgreSQL . . . . . . . . . . . . . . . . . . . . . . .215
Tests personnalisés avec pgbench . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
Tests des performances en insertion . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
Tests de performances du TPC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
Résumé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
9Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
Exemples d’index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
Mesure statistique des blocs d’index . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
Exécution d’un exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
Création du jeu de tests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
© 2011 Pearson Education France – Bases de données PostgreSQL – Gregory Smith
Book_PostgreSQL.indb 8
18/04/11 17:35
Table des matières
IX
Recherche simple dans l’index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
Parcours complet de table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
Création d’un index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
Recherche avec un index inefficace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
Combiner des index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
Basculer d’un parcours d’index à un parcours complet . . . . . . . . . . . . 229
Ordonner les valeurs de la table par rapport à un index . . . . . . . . . . . . 231
Plan d’exécution et compteur de blocs . . . . . . . . . . . . . . . . . . . . . . . . . . 233
Création et maintenance des index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
Index uniques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
Création non bloquante d’index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
Ordonner une table par rapport à un index . . . . . . . . . . . . . . . . . . . . . . . 235
Facteur de remplissage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
Ré-indexation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .236
Types d’index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
B-tree . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .237
Hash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .238
GIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
GiST . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
Utilisation avancée des index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
Index multicolonne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
Index pour le tri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
Index partiel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
Index fondé sur une expression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
Index pour la recherche plein texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
Résumé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
10 Optimisation des requêtes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243
Données pour les tests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243
Pagila . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
Dell Store 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
© 2011 Pearson Education France – Bases de données PostgreSQL – Gregory Smith
Book_PostgreSQL.indb 9
18/04/11 17:35
X
Bases de données PostgreSQL
Informations de bases sur EXPLAIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
Surcharge du chronométrage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
Cache à froid et cache à chaud . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
Structure d’un nœud du plan d’exécution . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
Calcul du coût de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250
Outils d’analyse de plan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252
EXPLAIN visuel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252
Affichage verbeux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
Affichage lisible par des programmes . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
Outils d’analyse de plan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254
Assembler des ensembles de lignes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254
Identifiant de ligne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254
Parcours séquentiel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
Parcours d’index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
Parcours d’index bitmap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
Traitement des nœuds . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
Tri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
Limite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
Agrégat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
HashAggregate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
Unique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
Result . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
Append . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
Group . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
Parcours de sous-requêtes et de sous-plan . . . . . . . . . . . . . . . . . . . . . . . 266
Opérations sur des ensembles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
Materialize . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
CTE Scan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
Jointures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270
Jointure par boucle imbriquée (Nested Loop) . . . . . . . . . . . . . . . . . . . . 270
Jointure d’assemblage (Merge Join) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
Jointures de hachage (Hash Join) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
© 2011 Pearson Education France – Bases de données PostgreSQL – Gregory Smith
Book_PostgreSQL.indb 10
18/04/11 17:35
Table des matières
XI
Statistiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
Visualisation et estimation des statistiques . . . . . . . . . . . . . . . . . . . . . . . 279
Cibles statistiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
Cas difficiles à estimer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
Autres paramètres du planificateur de requête . . . . . . . . . . . . . . . . . . . . . . . 285
effective_cache_size . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
work_mem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
constraint_exclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287
cursor_tuple_fraction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287
Exécuter d’autres types de requêtes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
Optimiser les requêtes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
Optimiser pour des données en cache . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
Tester l’équivalence des requêtes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
Désactiver les fonctionnalités du planificateur . . . . . . . . . . . . . . . . . . . 290
Contourner les bugs de l’optimiseur . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295
Éviter un changement de plan avec OFFSET . . . . . . . . . . . . . . . . . . . . 295
Problèmes externes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298
Limitations du SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298
Numéroter des lignes en SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298
Utilisation des fonctions de fenêtrage pour la numérotation . . . . . . . . 300
Utilisation des fonctions de fenêtrage pour calculer des cumuls . . . . 300
Résumé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
11 Activité et statistiques de la base de données . . . . . . . . . . . . . . . . . . . . . . . . . . 305
Vues statistiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
Vues cumulatives et vues instantanées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307
Statistiques sur les tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308
Entrées/sorties sur les tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
Statistiques sur les index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312
Entrées/sorties sur les index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
Cumuls par base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
© 2011 Pearson Education France – Bases de données PostgreSQL – Gregory Smith
Book_PostgreSQL.indb 11
18/04/11 17:35
XII
Bases de données PostgreSQL
Connexions et activités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
Verrous . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315
Transactions virtuelles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
Interpréter les informations des verrous . . . . . . . . . . . . . . . . . . . . . . . . . 317
Attente des verrous de transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
Attente de verrous de table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
Tracer les informations sur les verrous . . . . . . . . . . . . . . . . . . . . . . . . . . 322
Utilisation du disque . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
Activités sur les tampons, le bgwriter et les checkpoints . . . . . . . . . . . . . . 325
Sauvegarder des images de pg_stat_bgwriter . . . . . . . . . . . . . . . . . . . . 327
Améliorer la configuration en utilisant les statistiques du bgwriter . . 329
Résumé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
12 Supervision et tendances . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
Outils de supervision Unix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
Configuration d’exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334
vmstat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334
iostat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337
top . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345
sysstat et sar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
Outils de supervision Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350
Gestionnaire des tâches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350
Windows System Monitor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351
Logiciels d’analyse de tendance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353
Supervision et logiciels d’analyse de tendance . . . . . . . . . . . . . . . . . . . 353
Nagios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354
Cacti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356
Munin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357
Autres outils de tendance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357
Résumé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360
© 2011 Pearson Education France – Bases de données PostgreSQL – Gregory Smith
Book_PostgreSQL.indb 12
18/04/11 17:35
Table des matières XIII
13 Pool de connexions et cache de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363
Le multiplexage de connexions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363
Dimensionnement du pool de connexions . . . . . . . . . . . . . . . . . . . . . . . 364
pgpool-II . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366
pgBouncer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367
Cache externe de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368
memcached . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369
pgmemcache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369
Résumé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371
14 Montée en charge avec la réplication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373
Hot Standby . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374
Terminologie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374
Configurer l’envoi des journaux de transactions . . . . . . . . . . . . . . . . . . 375
Streaming Replication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376
Configurer le Hot Standby . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376
Gestionnaires de file de réplication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378
Slony . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379
Londiste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379
Répartir les lectures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380
Besoins spécifiques des applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380
Bucardo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380
pgpool-II . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381
Autres projets intéressants de réplication . . . . . . . . . . . . . . . . . . . . . . . . . . . 382
Résumé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383
15 Partitionner des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 385
Partitionner une table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 386
Déterminer la clé de partitionnement . . . . . . . . . . . . . . . . . . . . . . . . . . . 386
Dimensionner les partitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .387
Créer les partitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388
© 2011 Pearson Education France – Bases de données PostgreSQL – Gregory Smith
Book_PostgreSQL.indb 13
18/04/11 17:35
Bases de données PostgreSQL
XIV
Rediriger les instructions INSERT vers les partitions . . . . . . . . . . . . . 389
Plans d’exécution de requêtes pour des partitions vides . . . . . . . . . . . 392
Trigger de mise à jour sur le changement de date . . . . . . . . . . . . . . . . . 392
Migration en directe d’une table partitionnée . . . . . . . . . . . . . . . . . . . . 393
Requêtes sur les tables partitionnées . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395
Créer des nouvelles partitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 398
Avantages du partitionnement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .399
Erreurs habituelles avec le partitionnement . . . . . . . . . . . . . . . . . . . . . . 399
Partitionnement horizontal avec PL/Proxy . . . . . . . . . . . . . . . . . . . . . . . . . . 400
Génération de hachage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401
PL/proxy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402
GridSQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404
Résumé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405
16 Éviter les problèmes courants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407
Chargement en masse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407
Méthodes de chargement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 408
Configuration pour les chargements en masse . . . . . . . . . . . . . . . . . . . . 409
Éviter les écritures dans les journaux de transactions . . . . . . . . . . . . . 410
Récréer les index et ajouter les contraintes . . . . . . . . . . . . . . . . . . . . . . 411
Restauration parallélisée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411
Nettoyage post-chargement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412
Problèmes courants de performance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413
Compter les lignes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413
Écritures inexpliquées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414
Exécution lente des fonctions et requêtes préparées . . . . . . . . . . . . . . . 415
Tests de performances de PL/pgsql . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 416
Surcharge importante causée par les clés étrangères . . . . . . . . . . . . . . 416
Utilisation de la mémoire par les triggers . . . . . . . . . . . . . . . . . . . . . . . . 417
Charge importante causée par le collecteur de statistiques . . . . . . . . . 417
Vues matérialisées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .418
© 2011 Pearson Education France – Bases de données PostgreSQL – Gregory Smith
Book_PostgreSQL.indb 14
18/04/11 17:35
Table des matières XV
Profiler la base de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419
gprof . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419
OProfile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419
Visual Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419
DTrace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 420
Fonctionnalités en relation avec les performances par version . . . . . . . . . 421
Mise à jour agressive d’une version de PostgreSQL . . . . . . . . . . . . . . 421
8.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423
8.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423
8.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424
8.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425
9.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 427
Résumé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435
© 2011 Pearson Education France – Bases de données PostgreSQL – Gregory Smith
Book_PostgreSQL.indb 15
18/04/11 17:35