1 <?xml version="1.0" encoding="utf-8" ?>
2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
3 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
5 <!ENTITY in "<small style='font-size:small'>∈</small>">
6 <!ENTITY notin "<small style='font-size:small'>∉</small>">
11 <html xmlns="http://www.w3.org/1999/xhtml" >
13 <title>Prise en main de Postgresql</title>
15 <meta http-equiv="Content-Type"
16 content="text/html; charset=utf-8" />
17 <meta name="copyright"
18 content="Copyright © 2013 Kim Nguyễn" />
21 <script src="../jquery-2.0.3.min.js" type="text/javascript" ></script>
22 <script src="../libs/raphael-min.js" type="text/javascript" ></script>
23 <!-- Load the library -->
24 <script src="../simpleWebSlides.js" type="text/javascript" ></script>
26 <link rel="stylesheet" href="../simpleWebSlides.css" type="text/css" media="all" />
27 <!-- Load a custom Theme, the class-element marks this style-sheet
28 a "theme" that can be swtiched dynamicaly -->
29 <link class="sws-theme" rel="stylesheet" title="U-Psud style" href="../themes/uPsud.css" type="text/css" />
31 <!-- Customize some templates and initialize -->
33 <script type="text/javascript">
34 SWS.Config['sws-slide-change'] = SWS.Effects.slideChangeFadeOutIn;
35 SWS.Config['sws-object-deactivate'] = SWS.Effects.objectDeactivateFadeOut;
36 SWS.Config['sws-object-activate'] = SWS.Effects.objectActivateFadeIn;
38 //Ensures that we load SWS at the very end, after MathJax has
41 $(window).load(SWS.Presentation.init);
45 <a href="bd05.xhtml" class="sws-previous"/>
46 <div class="sws-slide sws-cover sws-option-nofooter">
47 <h1>Bases de données</h1>
48 <h3>Polytech Paris-Sud</h3>
49 <h3>Apprentis 4<sup>ème</sup> année</h3>
50 <h1>Cours 6 : Prise en main de Postgresql</h1>
51 <a href="mailto:kn@lri.fr">kn@lri.fr</a><br/>
52 <a href="http://www.lri.fr/~kn/">http://www.lri.fr/~kn</a>
55 <h1>Base d'exemple</h1>
56 <div class="sws-slide">
57 <h1>On considère la base d'exemple suivante</h1>
59 CREATE TABLE PEOPLE (<u>pid INTEGER PRIMARY key</u>,
60 firstname VARCHAR(30),
61 lastname VARCHAR(30));
63 CREATE TABLE MOVIE (<u>mid INTEGER PRIMARY KEY</u>,
64 title VARCHAR(90) NOT NULL,
65 year INTEGER NOT NULL,
66 runtime INTEGER NOT NULL,
67 rank INTEGER NOT NULL);
69 CREATE TABLE ROLE (mid INTEGER REFERENCES MOVIE,
70 pid INTEGER REFERENCES PEOPLE,
72 <u>PRIMARY KEY(mid, pid, name)</u>);
74 CREATE TABLE DIRECTOR (mid INTEGER REFERENCES MOVIE,
75 pid INTEGER REFERENCES PEOPLE,
76 <u>PRIMARY KEY (mid, pid)</u>);
80 <div class="sws-slide">
81 <h1>EXPLAIN ANALYSE</h1>
82 <p>On peut demander à Postgresql d'afficher le plan qu'il calcule pour
83 une requête avec les esitmations de coût :
85 <code> <u>EXPLAIN</u> requête; </code>
86 <p>Dans ce cas, la requête n'est pas évaluée. On peut aussi évaluer la
88 <code> <u>EXPLAIN ANALYSE</u> requête; </code>
89 <p>Dans ce cas, la requête est évaluée et les coût réels sont
90 affichés. S'ils divergent des coûts estimés, l'optimiseur s'est
91 trompé, par exemple parce que ses statistiques ne sont pas à
96 <div class="sws-slide">
97 <h1>EXPLAIN ANALYSE (suite)</h1>
100 EXPLAIN ANALYSE SELECT * FROM ROLE,PEOPLE WHERE
101 ROLE.pid = PEOPLE.pid;
104 <code> Hash Join (cost=312.07..822.95 rows=14535 width=37)
105 (actual time=14.799..44.691 rows=14535 loops=1)
106 Hash Cond: (role.pid = people.pid)
107 -> Seq Scan on role (cost=0.00..238.35 rows=14535 width=20)
108 (actual time=0.019..7.570 rows=14535 loops=1)
109 -> Hash (cost=175.92..175.92 rows=10892 width=17)
110 (actual time=14.711..14.711 rows=10892 loops=1)
111 -> Seq Scan on people (cost=0.00..175.92 rows=10892 width=17)
112 (actual time=0.015..5.944 rows=10892 loops=1)
115 <div class="sws-slide">
116 <h1>EXPLAIN ANALYSE (suite)</h1>
118 <u>Seq Scan</u> on people <a>(cost=0.00..175.92 rows=10892 width=17)</a>
119 <s>(actual time=0.015..5.944 rows=10892 loops=1)</s>
122 <li><u>Le nom de l'opérateur</u> ≡ nœud de l'arbre dans le plan de
124 <li><a>Estimation du coût</a> (voir suite)</li>
125 <li><s>Coût réel</s> n'apparaît que si on a fait <tt>EXPLAIN
126 ANALYSE</tt> (voir suite)</li>
129 <div class="sws-slide">
130 <h1>Estimation des coût</h1>
132 (<a>cost=0.00..175.92</a> <u>rows=10892</u> <s>width=17</s>)
135 <li><a>Estimation du coût</a>. Unité : temps que met une lecture de
136 bloc de 8ko (pour être indépendant du hardware). Le premier nombre
137 est le temps estimé pour avoir le premier résultat. Le deuxième le
138 temps estimé pour avoir l'ensemble.
140 <li><u>Estimation du nombre de lignes</u> dans le résultat</li>
141 <li><s>Taille des lignes en octets</s> </li>
144 <div class="sws-slide">
147 (<a>actual time=0.015..5.944</a> <u>rows=10892</u> <s>loops=1</s>)
150 <li><a>Coût réel</a>. Unité : <a>ms</a>. Devrait être proportionnel à
151 l'estimation si l'optimiseur ne s'est pas trompé. Le premier nombre
152 est le temps pour avoir le premier résultat. Le deuxième le
153 temps pour avoir l'ensemble.
155 <li><u>Nombre de lignes</u> dans le résultat</li>
156 <li><s>looks=x</s> l'opérateur a été appelé x fois</li>
159 <div class="sws-slide">
160 <h1>Lecture du plan de requête </h1>
162 <u>Hash Join</u> (cost=…) (actual time=…)
163 <u>Hash Cond</u>: (role.pid = people.pid)
164 <u>-></u> <s>Seq Scan</s> on role (cost=…) (actual time=…)
165 <u>-></u> <a>Hash</a> (cost=…) (actual time=…)
166 <a>-></a> <em style="color:orange">Seq Scan</em> on people (cost=…) (actual time=…)
169 <p style="text-align:center;">
170 <img style="width:70%" src="explain_plan.svg" alt="explain" />
172 <p>Note: les projections n'apparaissent pas, on peut les voir
173 avec <tt>EXPLAIN ANALYSE VERBOSE</tt>.</p>
175 <h1>Exemples d'opérateurs</h1>
176 <div class="sws-slide">
177 <h1>Nœuds fréquements rencontrés lors d'un EXPLAIN ANALYSE</h1>
178 <p>Les opérateurs sont déclinés selon les différents algorithmes
179 (jointure, tris, …)</p>
181 <li><tt>Seq Scan</tt>: Scan séquentiel</li>
182 <li><tt>Nested loop</tt>: Jointure itérative page à page</li>
183 <li><tt>Merge sort join</tt>: Jointure par tri fusion</li>
184 <li><tt>Hash join</tt>: jointure par hashage (généralisation de la
185 jointure sur index)</li>
186 <li><tt>Sort</tt>: Tri (le nœud indique l'algo de tri et la fonction
188 <li><tt>Index scan</tt>: scan d'un index (précise l'index et la condition)</li>
189 <li><tt>Hash</tt>: génération d'une table de hash à la volée</li>
190 <li><tt>Bitmap Index scan/Bitmap heap scan</tt>: génération et
191 utilisation d'un index bitmap à la volée (voire suite)</li>
192 <li><tt>Materialize</tt>: écriture de résultats intermédiaires sur le disque</li>
197 <div class="sws-slide">
198 <h1>Retour sur les opératuers « <i>Bitmap</i> »</h1>
199 <p>(Cours 5) si l'index est non-groupant, l'utilisation de l'index
200 peut provoquer une séquence de chargement/déchargement de pages
201 ruinant les performances
203 <p>Solution en deux phases</p>
205 <li>Scanner l'index et créer un bitmap de taille N où N est le
206 nombre de pages de la relation. Pour chaque entrée d'index
207 satisfaisant le résultat, mettre le bit correspondant à 1 (phase
211 Parcourir la relation dans l'ordre du disque, page à page. Si la
212 page est à 1 dans le bitmap, on la charge, sinon on l'ignore.
213 Une fois la page chargée il faut <u>réévaluer la condition</u> car on
214 a oublié quels étaients les résultats de l'index (phase Bitmap
218 <p>Intéret: Un bitmap est petit (si la relation contient 10000 pages,
219 le bitmap contient 10000 bits ou environs 1250 octets (soit moins
221 <p>Cela permet aussi de répondre efficacement aux requêtes
222 booléenes complexes (i.e. autre qu <tt>AND</tt>). En effet on
223 calcule un bitmap pour chaque sous-condition, et on fait les
224 opérations entre bitmap bit à bit.