Télécharger la présentation
La présentation est en train de télécharger. S'il vous plaît, attendez
Publié parMarie-Ange Yvette Bourget Modifié depuis plus de 8 années
1
PostgreSQL Et MVCC v.1.0 07/11/2009 Licence Creative Commmons CC-BY-NC-SA
2
Guillaume Lelarge Membre fondateur de PostgreSQLfr Contributeur de longue date Traduction de la documentation Patchs pour de nombreux projets (pgAdmin) Patchs pour PostgreSQL Promotion de PostgreSQL Articles dans linux mag Conférences Blog Consultant chez Dalibo
3
3 Sommaire MVCC Quel but ? Comment se font les modifications de données Avantages / Inconvénients Quelles solutions pour ces inconvénients Améliorations des différentes versions
4
4 MVCC Acronyme Multi Version Concurrency Control Autrement dit ? Contrôle des accès simultanés par gestion de différentes versions d'une même ligne
5
5 Principe Une lecture ne doit pas bloquer une autre lecture Une écriture ne doit pas bloquer une lecture Une lecture ne doit pas bloquer une écriture Une écriture ne doit pas bloquer une écriture Sauf si l'écriture concerne la même ligne
6
6 But de MVCC Fluidifier l'accès aux données grâce à des verrous légers Faciliter la vie des développeurs pas de gestion manuelle des verrous
7
7 L'implémentation 1/3 Du côté des processus clients À chaque début de transaction, un identifiant de transaction est associé SELECT virtualxid, transactionid FROM pg_locks; virtualxid transactionid 1/11 1877
8
8 L'implémentation 2/3 Chaque ligne de chaque table contient deux informations essentielles Identifiant de transaction qui a créé la ligne Identifiant de transaction qui a supprimé la ligne
9
9 L'implémentation 3/3 Chaque processus voit une image spécifique de la base de données Un processus/Une transaction ne voit que les lignes dont l'identifiant de création est inférieure à l'identifiant de la transaction et dont l'identifiant de suppression est supérieure à l'identifiant de transaction Et évidemment à condition que la transaction de création/suppression soit validée
10
10 Faisons quelques tests Base de tests pgday2009 createdb pgday2009 Une table t1, deux colonnes CREATE TABLE t1 (i integer, t text);
11
11 Insérons des lignes... Trois lignes pour commencer INSERT INTO t1 VALUES (1, 'un'), (2, 'deux'), (3, 'trois'); Vérifions leur présence avec un SELECT
12
12 Contenu réel de la table Il existe aussi des colonnes systèmes xmin, identifiant de transaction de création de la ligne xmax, identifiant de transaction de suppression de la ligne ctid, paire indiquant l'emplacement dans le fichier et quelques autres...
13
13 Contenu réel de la table - 2 Il existe aussi des colonnes systèmes xmin, identifiant de transaction de création de la ligne xmax, identifiant de transaction de suppression de la ligne ctid, paire indiquant l'emplacement dans le fichier SELECT xmin, xmax, ctid, * FROM t1;
14
14 Mettons à jour une ligne UPDATE t1 SET t=upper(t) WHERE i=2; SELECT xmin, xmax, ctid, * FROM t1; Mais que s'est-il réellement passé ? La ligne de ctid (0,2) est morte La nouvelle ligne est la (0,4)
15
15 Ligne vivante / Ligne morte Ancienne ligne 2 : ligne morte (dead tuple) Nouvelle ligne 2 : ligne vivante (live tuple) Ce comportement permet la sauvegarde à chaud (pg_dump)
16
16 Mettons à jour une ligne UPDATE t1 SET t=upper(t) WHERE i=2; À priori, cela ne modifie rien... SELECT xmin, xmax, ctid, * FROM t1; … et pourtant nous avons une nouvelle ligne vivante et une nouvelle ligne morte
17
17 Que peut-on en déduire Les lignes mortes grossissent la table indument Lecture séquentielle plus longue D'où des pertes de performance Résultat de ce comportement : fragmentation des tables La fragmentation est à combattre
18
18 Et si on insérait une ligne ? INSERT INTO t1 VALUES (4, 'quatre'); À quel emplacement va se trouver cette ligne ? En position 2 ? En position 4 ? En position 6 ?
19
19 Et si on insérait une ligne ? SELECT xmin, xmax, ctid, * FROM t1; Il n'a pas ré-utilisé l'espace mort ! Pourquoi ?
20
20 Pas de récup auto de l'espace mort PostgreSQL ne suit pas automatiquement les espaces morts Sans opération supplémentaire, la fragmentation ne pourra qu'augmenter D'où la commande VACUUM
21
21 VACUUM Lit séquentiellement la table Vérifie pour chaque ligne morte si la ligne est toujours visible par certaines transactions Sinon, enregistre l'information dans une structure appelée FSM
22
22 FSM Acronyme de Free Space Map Pour les versions < 8.4 Structure en mémoire uniquement Configuration max_fsm_pages et max_fsm_relations À partir de la 8.4 Structure disque Développement de Heikki Linnakangas Disparition des paramètres max_fsm_*
23
23 Et si on testait un VACUUM ? VACUUM VERBOSE t1; INFO: exécution du VACUUM sur « public.t1 » INFO: « t1 » : 2 versions de ligne supprimables, 4 non supprimables parmi 1 pages sur 1 DÉTAIL : 0 versions de lignes mortes ne peuvent pas encore être supprimées. Il y avait 1 pointeurs d'éléments inutilisés. 0 pages sont entièrement vides. CPU 0.00s/0.00u sec elapsed 0.00 sec. INFO: exécution du VACUUM sur « pg_toast.pg_toast_34333 » INFO: l'index « pg_toast_34333_index » contient maintenant 0 versions de ligne dans 1 pages DÉTAIL : 0 versions de ligne d'index ont été supprimées. 0 pages d'index ont été supprimées, 0 sont actuellement réutilisables. CPU 0.00s/0.00u sec elapsed 0.00 sec. INFO: « pg_toast_34333 » : 0 versions de ligne supprimables, 0 non supprimables parmi 0 pages sur 0 DÉTAIL : 0 versions de lignes mortes ne peuvent pas encore être supprimées. Il y avait 0 pointeurs d'éléments inutilisés. 0 pages sont entièrement vides. CPU 0.00s/0.00u sec elapsed 0.00 sec. VACUUM
24
24 Explication de texte 1/3 VACUUM VERBOSE t1; INFO: exécution du VACUUM sur « public.t1 » INFO: « t1 » : 2 versions de ligne supprimables, 4 non supprimables parmi 1 pages sur 1 DÉTAIL : 0 versions de lignes mortes ne peuvent pas encore être supprimées. Il y avait 1 pointeurs d'éléments inutilisés. 0 pages sont entièrement vides. CPU 0.00s/0.00u sec elapsed 0.00 sec. INFO: exécution du VACUUM sur « pg_toast.pg_toast_34333 » INFO: l'index « pg_toast_34333_index » contient maintenant 0 versions de ligne dans 1 pages DÉTAIL : 0 versions de ligne d'index ont été supprimées. 0 pages d'index ont été supprimées, 0 sont actuellement réutilisables. CPU 0.00s/0.00u sec elapsed 0.00 sec. INFO: « pg_toast_34333 » : 0 versions de ligne supprimables, 0 non supprimables parmi 0 pages sur 0 DÉTAIL : 0 versions de lignes mortes ne peuvent pas encore être supprimées. Il y avait 0 pointeurs d'éléments inutilisés. 0 pages sont entièrement vides. CPU 0.00s/0.00u sec elapsed 0.00 sec. VACUUM
25
25 Explication de texte 2/3 VACUUM VERBOSE t1; INFO: exécution du VACUUM sur « public.t1 » INFO: « t1 » : 2 versions de ligne supprimables, 4 non supprimables parmi 1 pages sur 1 DÉTAIL : 0 versions de lignes mortes ne peuvent pas encore être supprimées. Il y avait 1 pointeurs d'éléments inutilisés. 0 pages sont entièrement vides. CPU 0.00s/0.00u sec elapsed 0.00 sec. INFO: exécution du VACUUM sur « pg_toast.pg_toast_34333 » INFO: l'index « pg_toast_34333_index » contient maintenant 0 versions de ligne dans 1 pages DÉTAIL : 0 versions de ligne d'index ont été supprimées. 0 pages d'index ont été supprimées, 0 sont actuellement réutilisables. CPU 0.00s/0.00u sec elapsed 0.00 sec. INFO: « pg_toast_34333 » : 0 versions de ligne supprimables, 0 non supprimables parmi 0 pages sur 0 DÉTAIL : 0 versions de lignes mortes ne peuvent pas encore être supprimées. Il y avait 0 pointeurs d'éléments inutilisés. 0 pages sont entièrement vides. CPU 0.00s/0.00u sec elapsed 0.00 sec. VACUUM
26
26 Explication de texte 3/3 VACUUM VERBOSE t1; INFO: exécution du VACUUM sur « public.t1 » INFO: « t1 » : 2 versions de ligne supprimables, 4 non supprimables parmi 1 pages sur 1 DÉTAIL : 0 versions de lignes mortes ne peuvent pas encore être supprimées. Il y avait 1 pointeurs d'éléments inutilisés. 0 pages sont entièrement vides. CPU 0.00s/0.00u sec elapsed 0.00 sec. INFO: exécution du VACUUM sur « pg_toast.pg_toast_34333 » INFO: l'index « pg_toast_34333_index » contient maintenant 0 versions de ligne dans 1 pages DÉTAIL : 0 versions de ligne d'index ont été supprimées. 0 pages d'index ont été supprimées, 0 sont actuellement réutilisables. CPU 0.00s/0.00u sec elapsed 0.00 sec. INFO: « pg_toast_34333 » : 0 versions de ligne supprimables, 0 non supprimables parmi 0 pages sur 0 DÉTAIL : 0 versions de lignes mortes ne peuvent pas encore être supprimées. Il y avait 0 pointeurs d'éléments inutilisés. 0 pages sont entièrement vides. CPU 0.00s/0.00u sec elapsed 0.00 sec. VACUUM
27
27 Et maintenant, faisons un INSERT INSERT INTO t1 VALUES (5, 'cinq'); À quel emplacement va se trouver cette ligne ? En position 2 ? En position 4 ? En position 7 ?
28
28 Et maintenant, faisons un INSERT INSERT INTO t1 VALUES (5, 'cinq'); YES ! C'est à ça que sert le VACUUM Explication des SELECT sans ORDER BY
29
29 Et la taille de la table ? Elle ne change pas, ou alors très peu Pour réellement réduire la taille de la table... VACUUM FULL Utile dans quelques cas Plusieurs années de lignes supprimées d'un coup … et ça doit être tout (Gros) problèmes Verrou exclusif Dégrade les performances des index
30
30 La fragmentation n'est pas le diable Un peu de fragmentation peut être utile Suffisamment pour qu'il soit possible de la réclamer Clause FILL FACTOR À partir de la 8.2 Par défaut: 100% pour les tables 90% pour les index
31
31 autovacuum Apparu en 8.1 (en module contrib avant) Permet de paramétrer l'exécution automatique d'un VACUUM après une certaine activité autovacuum_vacuum_threshold autovacuum_vacuum_scale_factor à comparer à n_dead_tup Pas de lancement de VACUUM FULL en automatique
32
32 Nouveau FSM À partir de la 8.4 Pas de perte d'informations sur les blocs disponibles Stocké sur disque dans les fichiers d'extension _fsm Placé en mémoire dans le cache disque (shared_buffers)
33
33 VACUUM partiel En 8.4 Ne lit que les pages disque modifiées depuis le dernier VACUUM VACUUM complet (pas FULL) forcé si l'âge de la table a dépassé vacuum_freeze_table_age
34
34 Conclusion MVCC a de très nombreux avantages Ses inconvénients peuvent être diminués À condition de bien comprendre le fonctionnement de PostgreSQL
35
35 PGDay 2009 N'oubliez pas de rendre compte de votre appréciation des conférences http://2009.pgday.eu/feedback
36
36 Merci... d'être venu et de m'avoir écouté :) Vos questions sont les bienvenues !
Présentations similaires
© 2024 SlidePlayer.fr Inc.
All rights reserved.