Merge branch 'master' of ssh://git.nguyen.vg/hacks/simpleWebSlides
authorKim Nguyễn <kn@lri.fr>
Mon, 13 Apr 2015 22:59:06 +0000 (00:59 +0200)
committerKim Nguyễn <kn@lri.fr>
Mon, 13 Apr 2015 22:59:06 +0000 (00:59 +0200)
* 'master' of ssh://git.nguyen.vg/hacks/simpleWebSlides:
  .
  .

bd/bd04.xhtml
bd/bd05.xhtml
bd/bd06.xhtml [new file with mode: 0644]
bd/example_plan.svg
bd/explain_plan.svg [new file with mode: 0644]
bd/pdf/bd04.pdf
bd/pdf/bd04_print.pdf
bd/pdf/bd05.pdf
bd/pdf/bd05_print.pdf
bd/pdf/bd06.pdf [new file with mode: 0644]
bd/pdf/bd06_print.pdf [new file with mode: 0644]

index c3a55b9..29656b9 100644 (file)
@@ -49,7 +49,8 @@
       <h3>Apprentis 4<sup>ème</sup> année</h3>
       <h1>Cours 4 : Optimisation des opérateurs</h1>
       <a href="mailto:kn@lri.fr">kn@lri.fr</a><br/>
-      <a href="http://www.lri.fr/~kn/">http://www.lri.fr/~kn</a>
+      <a href="http://www.lri.fr/~kn/">http://www.lri.fr/~kn</a><br/>
+      <a>version mise à jour le 09/04/2015</a>
     </div>
 
     <h1>Motivation</h1>
@@ -93,8 +94,8 @@
        L'AR nous dit que <tt>R &join; S = &sigma;<sub>=</sub>(R x
       T)</tt>, mais c'est <s>très inefficace</s>, on veut optimiser ce cas!
       </p>
-      <p>On suppose dans la suite M enregistrements dans R,
-       P<sub>R</sub> enregistrements/page, N enregistrement dans S,
+      <p>On suppose dans la suite M pages dans R,
+       P<sub>R</sub> enregistrements/page, N pages dans S,
        P<sub>S</sub> enregistrements/page.
       </p>
       <p>On pose pour les exemples: M=1000, N=500, P<sub>R</sub>=120, P<sub>S</sub>=100</p>
index 5c5c6f0..9ff0195 100644 (file)
       annotés avec un algorithme particulier.
       </p>
       <ul>
-       <li>Pour une requête donnée, quels plans doit-on considérer
+       <li>Pour une requête donnée, quels plans doit on considérer
        ?</li>
        <li>Comment peut on estimer le coût total d'un plan</li>
       </ul>
 </code>
 <p><img class="sws-pause" src="simple_plan.svg" width="50%"/></p>
 <ul>
-  <li class="sws-pause">Cout: 500+500*1000 E/S (pourquoi ?)</li>
+  <li class="sws-pause">Coût: 500+500*1000 E/S (pourquoi ?)</li>
   <li> Plusieurs occasions manquées : pas d'utilisation d'index, on
-  aurait pu pousser la selection sous la jointure, …</li>
+  aurait pu pousser la sélection sous la jointure, …</li>
   <li> Notre but est de trouver des plans d'exécution plus efficaces
   qui calculent le même résultat</li>
 </ul>
       <h1>Plan alternatif 1 (sans index)</h1>
 <p><img class="sws-pause" src="simple_plan1.svg" width="50%"/></p>
 <p class="sws-pause">On pousse la sélection sous la jointure (car
-  selection <tt>AND</tt>). On suppose qu'on a 100
+  sélection <tt>AND</tt>). On suppose qu'on a 100
   bateaux, 10 notes et distributions uniformes. </p>
 <ul>
-  <li>Scan Reserves (1000 E/S) et écriture de 10 pages dans T1</li>
-  <li>Scan Sailors (500 E/S) et écriture de 250 pages dans T2</li>
+  <li>Scan <tt>Reserves</tt> (1000 E/S) et écriture de 10 pages dans T1</li>
+  <li>Scan <tt>Sailors</tt> (500 E/S) et écriture de 250 pages dans T2</li>
   <li>Tri T1 (3*10 E/S), Tri T2 (8*250 E/S), fusion (10+250 E/S)</li>
   <li>Total: <em>4050 E/S</em></li>
-  <li>Si on pousse la projection, T1 ne contient que sid, T2
-    uniquement sid et sname (cout <tt>&lt;</tt> 2000 E/S)</li>
+  <li>Si on pousse la projection, T1 ne contient que <tt>sid</tt>, T2
+    uniquement <tt>sid</tt> et <tt>sname</tt> (cout <tt>&lt;</tt> 2000 E/S)</li>
 </ul>
     </div>
     <div class="sws-slide">
@@ -260,13 +260,13 @@ Exemples de facteurs de réduction:
   <h1>Autres équivalences</h1>
   <ul>
     <li>
-Une projection commute avec une selection qui utilise uniquement
+Une projection commute avec une sélection qui utilise uniquement
   les attributs de la projection</li>
-    <li>Une selection entre des attributs de deux arguments d'un
+    <li>Une sélection entre des attributs de deux arguments d'un
     produit cartésien peut être converti en jointure:
       <tt> &sigma;<sub>&phi;</sub> (R &times; S) ≡ R &join;<sub>&phi;</sub> S</tt>
       </li>
-    <li>Une selection sur des attributs de <tt>R</tt> commute avec la
+    <li>Une sélection sur des attributs de <tt>R</tt> commute avec la
     jointure <tt>R&join;S</tt> (c'est à dire:  <tt>&sigma;(R&join;S) ≡  &sigma;(R)&join;S </tt>)
       </li>
     <li>Règle similaire pour pousser les projections sous jointure</li>
@@ -279,18 +279,18 @@ Une projection commute avec une selection qui utilise uniquement
   Les SGBD modernes utilisent un modèle de
   calcul <em><i>pull</i></em>. L'opérateur le plus «&nbsp;haut&nbsp;» (racine)
   dans l'arbre de requête «&nbsp;tire&nbsp;» (<i>pull</i>) le résultat de ses
-  sous-arbres (similaire à l'appel de <i>next</i> sur les iterateurs
+  sous-arbres (similaire à l'appel de <i>next</i> sur les itérateurs
   de la bibliothèque standard Java). Cela permet
   de <em><i>pipeliner</i></em> les opérateurs. Certains opérateurs «
   <em>bloquent</em> » le <i>pipeline</i> (en particulier les tris et
-  aggrégats).
+  agrégats).
 </p>
 
 </div>
 <div class="sws-slide">
 <h1>Cas mono-relation</h1>
 <p>Dans le cas mono-relation (i.e. sans jointure), la requête est
-  composée forcément de selections, projections et aggrégats
+  composée forcément de sélections, projections et agrégats
   (<tt>max</tt>, <tt>count</tt>, <tt>average</tt>, …)</p>
 <ol>
   <li>Pour chaque sous-terme, on considère tous les accès possibles
@@ -304,15 +304,15 @@ Une projection commute avec une selection qui utilise uniquement
 <div class="sws-slide">
 <h1>Estimation du coût pour les plans mono-relation</h1>
 <ul>
-<li> Si on a un index I pour une selection sur clé primaire :
+<li> Si on a un index I pour une sélection sur clé primaire :
   <tt><s>Hauteur(I) + 1</s></tt> pour un arbre B+, <tt><s>1.2</s></tt>
   pour un hash-index</li>
 <li> Si on a un index I groupant pour plusieurs
-  selection <tt>&sigma;<sub>1</sub></tt>, …, <tt>&sigma;<sub>n</sub></tt> :<br/>
+  sélection <tt>&sigma;<sub>1</sub></tt>, …, <tt>&sigma;<sub>n</sub></tt> :<br/>
   <tt><s>(NPages(I) + NPages(R))* RF(&sigma;<sub>1</sub>) * … * RF(&sigma;<sub>n</sub>) </s></tt>
 </li>
 <li> Si on a un index I non-groupant pour plusieurs
-  selection <tt>&sigma;<sub>1</sub></tt>, …, <tt>&sigma;<sub>n</sub></tt> :<br/>
+  sélection <tt>&sigma;<sub>1</sub></tt>, …, <tt>&sigma;<sub>n</sub></tt> :<br/>
   <tt><s>(NPages(I) + <u>NEnr</u>(R))* RF(&sigma;<sub>1</sub>) * … * RF(&sigma;<sub>n</sub>) </s></tt>
 </li>
 <li>Scan séquentiel à <tt>R</tt>: <tt><s>NPages(R)</s></tt></li>
@@ -343,7 +343,7 @@ Une projection commute avec une selection qui utilise uniquement
   <h1>Requêtes multi-relations</h1>
 <ul><li>Les choix vont être guidé par les <em>jointures</em></li>
   <li>Si on considère uniquement <tt>n</tt> jointures (pas de projections ni
-  de selections dans le plan de requête). Le nombre de plans possible
+  de sélections dans le plan de requête). Le nombre de plans possible
   est le nombre d'arbre binaires ayant <tt>n</tt> noeuds internes
   (exponentiel en <tt>n</tt>, exactement: nombre de Catalan
   d'indice <tt>n</tt>). <s>Beaucoup trop pour les énumérer tous</s>.
@@ -390,7 +390,7 @@ Une projection commute avec une selection qui utilise uniquement
     peuvent êtres faites en <em><i>pipeline</i> (ou <i>streaming</i></em> sans
     itération/matérialisation des résultats intermédiaires
   </li>
-  <li>Celà peut valoir le coup d'utiliser un <i>merge-sort</i> join
+  <li>Cela peut valoir le coup d'utiliser un <i>merge-sort</i> join
     (possiblement coûteux) si on demande les résultats dans un <em>certain
     ordre</em> (<tt>ORDER BY</tt> compatible avec celui de la jointure). Cela évite de faire
     une jointure suivie d'un tri.
@@ -452,7 +452,7 @@ uniformément réparties. Tous les sid et tous les bid sont présents
             float:left;'>
  </span>
 
-On choisi de faire d'abord une jointure entre R et S (i.e. un produit
+On choisi de faire d'abord une jointure entre B et S (i.e. un produit
 cartésien car il n'y a pas de condition de jointure entre ces deux
 tables). Puis la jointure de la table résultante avec B sur les
 attributs (bid,sid).
@@ -461,13 +461,13 @@ attributs (bid,sid).
   directement sur S, puis la jointure <tt>B &join;
   (&sigma;(S))</tt></em>. Pas d'utilisation d'index possible, jointure page
   à page (car on génère tout le produit cartésien) : <tt>100 ×
-  (100 + 200) = 300 000</tt> E/S (pages) ou 192 000 000 enr.
+  (100 + 200) = 30 000</tt> E/S (pages) ou 19 200 000 enr.
 </p>
 <p>Puis jointure <em>itérative page à page</em> avec R (<em>pas d'index sur R</em>, pas d'index
-  sur le résultat précédant qu'on vient de créer en mémoire):
-  <tt>1 000 × (300 000 + 1000) = 301 000 000 E/S.</tt>
+  sur le résultat précédent qu'on vient de créer en mémoire):
+  <tt>1 000 × (30 000 + 1000) = 31 000 000 E/S.</tt>
 </p>
-<p>Coût total: <tt>301 300 000 E/S</tt> (les projections sont faites
+<p>Coût total: <tt>31 300 000 E/S</tt> (les projections sont faites
   en pipline à la fin)</p>
 <p style="background:white">Plan complètement inefficace. On ignorera les plans contenant un
   produit cartésien, sauf si c'est le seul moyen de calculer la
@@ -502,10 +502,10 @@ sur <tt>sid</tt>.</p>
 <p>La deuxième jointure peut être faite à la volée (jointure itérative
   par index sur <tt>S.sid</tt>) et la condition de sélection testée à
   la volée. Coût total 100 000 × 3 (pour chacun des enregistrement
-  précédants, on paye un accès d'index + un accès à la ligne
+  précédents, on paye un accès d'index + un accès à la ligne
   correspondante dans S).
 </p>
-<p>Coût total: <tt>601 000 E/S</tt> (les projections sont faites en pipline à la fin)</p>
+<p>Coût total: <tt>601 000 E/S</tt> (les projections sont faites en <i>pipline</i> à la fin)</p>
 </div>
 
 <div class="sws-slide">
@@ -539,7 +539,7 @@ sur <tt>sid</tt>.</p>
 <p> On fait une jointure page à page des deux résultats
  précédents : <tt>100 + 100 × 1515 = 100 615 E/S</tt>.
 </p>
-<p>Coût total: <tt>102 630 E/S</tt> (les projections sont faites en pipline à la fin)</p>
+<p>Coût total: <tt>102 630 E/S</tt> (les projections sont faites en <i>pipline</i> à la fin)</p>
 </div>
 
 
@@ -582,7 +582,7 @@ sur <tt>bid</tt>.</p>
 
 <ul>
   <li>Utiliser l'index n'est pas toujours payant, surtout s'il est
-    non-groupant et qu'il car on ajoute un facteur qui est le nombre de
+    non-groupant, car on ajoute un facteur qui est le nombre de
     résultats, pas le nombre de pages</li>
   <li>On a fait certaines approximations « à la louche » (taille des
     enregistrements résultants d'une jointure, nombre des
diff --git a/bd/bd06.xhtml b/bd/bd06.xhtml
new file mode 100644 (file)
index 0000000..feb370b
--- /dev/null
@@ -0,0 +1,229 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
+[
+         <!ENTITY in  "<small style='font-size:small'>∈</small>">
+         <!ENTITY notin  "<small style='font-size:small'>∉</small>">
+         <!ENTITY mapsto  "↦">
+         <!ENTITY join    "⨝">
+]
+          >
+<html xmlns="http://www.w3.org/1999/xhtml" >
+  <head>
+    <title>Prise en main de Postgresql</title>
+
+    <meta http-equiv="Content-Type"
+          content="text/html; charset=utf-8" />
+    <meta name="copyright"
+          content="Copyright &#169; 2013 Kim Nguyễn" />
+
+    <!-- Load jQuery -->
+    <script src="../jquery-2.0.3.min.js" type="text/javascript" ></script>
+    <script src="../libs/raphael-min.js" type="text/javascript" ></script>
+    <!-- Load the library -->
+    <script src="../simpleWebSlides.js" type="text/javascript" ></script>
+
+    <link rel="stylesheet" href="../simpleWebSlides.css" type="text/css"  media="all" />
+    <!-- Load a custom Theme, the class-element marks this style-sheet
+         a "theme" that can be swtiched dynamicaly -->
+    <link class="sws-theme" rel="stylesheet"  title="U-Psud style"  href="../themes/uPsud.css" type="text/css" />
+
+    <!-- Customize some templates and initialize -->
+
+    <script type="text/javascript">
+      SWS.Config['sws-slide-change'] = SWS.Effects.slideChangeFadeOutIn;
+      SWS.Config['sws-object-deactivate'] =  SWS.Effects.objectDeactivateFadeOut;
+      SWS.Config['sws-object-activate'] = SWS.Effects.objectActivateFadeIn;
+
+      //Ensures that we load SWS at the very end, after MathJax has
+      //been initialized
+
+      $(window).load(SWS.Presentation.init);
+    </script>
+  </head>
+  <body>
+    <a href="bd05.xhtml" class="sws-previous"/>
+    <div class="sws-slide sws-cover sws-option-nofooter">
+      <h1>Bases de données</h1>
+      <h3>Polytech Paris-Sud</h3>
+      <h3>Apprentis 4<sup>ème</sup> année</h3>
+      <h1>Cours 6 : Prise en main de Postgresql</h1>
+      <a href="mailto:kn@lri.fr">kn@lri.fr</a><br/>
+      <a href="http://www.lri.fr/~kn/">http://www.lri.fr/~kn</a>
+    </div>
+
+    <h1>Base d'exemple</h1>
+    <div class="sws-slide">
+      <h1>On considère la base d'exemple suivante</h1>
+<code>
+ CREATE TABLE PEOPLE (<u>pid INTEGER PRIMARY key</u>,
+                     firstname VARCHAR(30),
+                    lastname VARCHAR(30));
+
+ CREATE TABLE MOVIE (<u>mid INTEGER PRIMARY KEY</u>,
+                    title VARCHAR(90) NOT NULL,
+                   year INTEGER NOT NULL,
+                   runtime INTEGER NOT NULL,
+                   rank INTEGER NOT NULL);
+
+ CREATE TABLE ROLE (mid INTEGER REFERENCES MOVIE,
+                   pid INTEGER REFERENCES PEOPLE,
+                  name VARCHAR(70),
+                   <u>PRIMARY KEY(mid, pid, name)</u>);
+
+ CREATE TABLE DIRECTOR (mid INTEGER REFERENCES MOVIE,
+                              pid INTEGER REFERENCES PEOPLE,
+                      <u>PRIMARY KEY (mid, pid)</u>);
+</code>
+    </div>
+<h1>EXPLAIN</h1>
+<div class="sws-slide">
+<h1>EXPLAIN ANALYSE</h1>
+<p>On peut demander à Postgresql d'afficher le plan qu'il calcule pour
+  une requête avec les esitmations de coût :
+</p>
+<code>  <u>EXPLAIN</u> requête; </code>
+<p>Dans ce cas, la requête n'est pas évaluée. On peut aussi évaluer la
+  requête :</p>
+<code>  <u>EXPLAIN ANALYSE</u> requête; </code>
+<p>Dans ce cas, la requête est évaluée et les coût réels sont
+  affichés. S'ils divergent des coûts estimés, l'optimiseur s'est
+  trompé, par exemple parce que ses statistiques ne sont pas à
+  jour</p>
+
+</div>
+
+<div class="sws-slide">
+<h1>EXPLAIN ANALYSE (suite)</h1>
+<p>On considère: </p>
+<code>
+  EXPLAIN ANALYSE SELECT * FROM ROLE,PEOPLE WHERE
+                    ROLE.pid = PEOPLE.pid;
+</code>
+<p>On obtient :</p>
+<code> Hash Join (cost=312.07..822.95 rows=14535 width=37)
+          (actual time=14.799..44.691 rows=14535 loops=1)
+   Hash Cond: (role.pid = people.pid)
+   -> Seq Scan on role (cost=0.00..238.35 rows=14535 width=20)
+                       (actual time=0.019..7.570 rows=14535 loops=1)
+   -> Hash (cost=175.92..175.92 rows=10892 width=17)
+           (actual time=14.711..14.711 rows=10892 loops=1)
+         -> Seq Scan on people (cost=0.00..175.92 rows=10892 width=17)
+                               (actual time=0.015..5.944 rows=10892 loops=1)
+</code>
+</div>
+<div class="sws-slide">
+<h1>EXPLAIN ANALYSE (suite)</h1>
+<code>
+<u>Seq Scan</u> on people <a>(cost=0.00..175.92 rows=10892 width=17)</a>
+                               <s>(actual time=0.015..5.944 rows=10892 loops=1)</s>
+</code>
+<ul>
+<li><u>Le nom de l'opérateur</u> ≡ nœud de l'arbre dans le plan de
+  requête</li>
+<li><a>Estimation du coût</a> (voir suite)</li>
+<li><s>Coût réel</s> n'apparaît que si on a fait <tt>EXPLAIN
+    ANALYSE</tt> (voir suite)</li>
+</ul>
+</div>
+<div class="sws-slide">
+<h1>Estimation des coût</h1>
+<code>
+ (<a>cost=0.00..175.92</a> <u>rows=10892</u> <s>width=17</s>)
+</code>
+<ul>
+<li><a>Estimation du coût</a>. Unité : temps que met une lecture de
+  bloc de 8ko (pour être indépendant du hardware). Le premier nombre
+  est le temps estimé pour avoir le premier résultat. Le deuxième le
+  temps estimé pour avoir l'ensemble.
+</li>
+<li><u>Estimation du nombre de lignes</u> dans le résultat</li>
+<li><s>Taille des lignes en octets</s> </li>
+</ul>
+</div>
+<div class="sws-slide">
+<h1>Coût réel</h1>
+<code>
+  (<a>actual time=0.015..5.944</a> <u>rows=10892</u> <s>loops=1</s>)
+</code>
+<ul>
+<li><a>Coût réel</a>. Unité : <a>ms</a>. Devrait être proportionnel à
+  l'estimation si l'optimiseur ne s'est pas trompé. Le premier nombre
+  est le temps pour avoir le premier résultat. Le deuxième le
+  temps pour avoir l'ensemble.
+</li>
+<li><u>Nombre de lignes</u> dans le résultat</li>
+<li><s>looks=x</s> l'opérateur a été appelé x fois</li>
+</ul>
+</div>
+<div class="sws-slide">
+<h1>Lecture du plan de requête </h1>
+<code>
+ <u>Hash Join</u> (cost=…) (actual time=…)
+   <u>Hash Cond</u>: (role.pid = people.pid)
+   <u>-&gt;</u> <s>Seq Scan</s> on role (cost=…) (actual time=…)
+   <u>-&gt;</u> <a>Hash</a> (cost=…) (actual time=…)
+         <a>-&gt;</a> <em style="color:orange">Seq Scan</em> on people (cost=…) (actual time=…)
+
+</code>
+<p style="text-align:center;">
+<img style="width:70%" src="explain_plan.svg" alt="explain" />
+</p>
+<p>Note: les projections n'apparaissent pas, on peut les voir
+  avec <tt>EXPLAIN ANALYSE VERBOSE</tt>.</p>
+</div>
+<h1>Exemples d'opérateurs</h1>
+<div class="sws-slide">
+<h1>Nœuds fréquements rencontrés lors d'un EXPLAIN ANALYSE</h1>
+<p>Les opérateurs sont déclinés selon les différents algorithmes
+  (jointure, tris, …)</p>
+<ul>
+<li><tt>Seq Scan</tt>: Scan séquentiel</li>
+<li><tt>Nested loop</tt>: Jointure itérative page à page</li>
+<li><tt>Merge sort join</tt>: Jointure par tri fusion</li>
+<li><tt>Hash join</tt>: jointure par hashage (généralisation de la
+  jointure sur index)</li>
+<li><tt>Sort</tt>: Tri (le nœud indique l'algo de tri et la fonction
+  de comparaison)</li>
+<li><tt>Index scan</tt>: scan d'un index (précise l'index et la condition)</li>
+<li><tt>Hash</tt>: génération d'une table de hash à la volée</li>
+<li><tt>Bitmap Index scan/Bitmap heap scan</tt>: génération et
+  utilisation d'un index bitmap à la volée (voire suite)</li>
+<li><tt>Materialize</tt>: écriture de résultats intermédiaires sur le disque</li>
+</ul>
+
+
+</div>
+<div class="sws-slide">
+<h1>Retour sur les opératuers « <i>Bitmap</i> »</h1>
+<p>(Cours 5) si l'index est non-groupant, l'utilisation de l'index
+  peut provoquer une séquence de chargement/déchargement de pages
+  ruinant les performances
+</p>
+<p>Solution en deux phases</p>
+<ul>
+  <li>Scanner l'index et créer un bitmap de taille N où N est le
+  nombre de pages de la relation. Pour chaque entrée d'index
+  satisfaisant le résultat, mettre le bit correspondant à 1 (phase
+  Bitmap Index Scan)
+  </li>
+  <li>
+    Parcourir la relation dans l'ordre du disque, page à page. Si la
+    page est à 1 dans le bitmap, on la charge, sinon on l'ignore.
+    Une fois la page chargée il faut <u>réévaluer la condition</u> car on
+    a oublié quels étaients les résultats de l'index (phase Bitmap
+    Heap Scan)
+  </li>
+</ul>
+<p>Intéret: Un bitmap est petit (si la relation contient 10000 pages,
+  le bitmap contient 10000 bits ou environs 1250 octets (soit moins
+  d'une page).</p>
+<p>Cela permet aussi de répondre efficacement aux requêtes
+  booléenes complexes (i.e. autre qu <tt>AND</tt>). En effet on
+  calcule un bitmap pour chaque sous-condition, et on fait les
+  opérations entre bitmap bit à bit.
+</p>
+</div>
+<h1>Démo</h1>
+</body>
+</html>
index 3c3812f..677ff8f 100644 (file)
@@ -9,11 +9,11 @@
    xmlns="http://www.w3.org/2000/svg"
    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="568.40125"
-   height="122.59209"
+   width="572.80127"
+   height="126.99208"
    id="svg2"
    version="1.1"
-   inkscape:version="0.48.5 r10040"
+   inkscape:version="0.48.4 r9939"
    sodipodi:docname="example_plan.svg">
   <defs
      id="defs4" />
      inkscape:pageopacity="0.0"
      inkscape:pageshadow="2"
      inkscape:zoom="1.3734375"
-     inkscape:cx="375.34095"
-     inkscape:cy="69.837239"
+     inkscape:cx="377.54095"
+     inkscape:cy="72.037241"
      inkscape:document-units="px"
      inkscape:current-layer="layer1"
      showgrid="true"
-     fit-margin-top="0.3"
-     fit-margin-left="0.3"
-     fit-margin-right="0.3"
-     fit-margin-bottom="0.3"
-     inkscape:window-width="1317"
-     inkscape:window-height="744"
-     inkscape:window-x="49"
-     inkscape:window-y="24"
-     inkscape:window-maximized="1">
+     fit-margin-top="2"
+     fit-margin-left="2"
+     fit-margin-right="2"
+     fit-margin-bottom="2"
+     inkscape:window-width="1631"
+     inkscape:window-height="1026"
+     inkscape:window-x="1249"
+     inkscape:window-y="407"
+     inkscape:window-maximized="1"
+     units="pt">
     <inkscape:grid
        type="xygrid"
        id="grid2985"
@@ -46,8 +47,8 @@
        visible="true"
        enabled="true"
        snapvisiblegridlinesonly="true"
-       originx="119.10664px"
-       originy="-809.51591px" />
+       originx="121.30664px"
+       originy="-807.31591px" />
   </sodipodi:namedview>
   <metadata
      id="metadata7">
@@ -65,9 +66,9 @@
      inkscape:label="Layer 1"
      inkscape:groupmode="layer"
      id="layer1"
-     transform="translate(119.10664,-120.25418)">
+     transform="translate(121.30664,-118.05418)">
     <g
-       id="g3147">
+       id="g3116">
       <text
          sodipodi:linespacing="125%"
          id="text2987"
            x="140"
            id="tspan3314"
            sodipodi:role="line">Plan 2</tspan></text>
-      <g
-         transform="translate(0,-3.4545898e-6)"
-         id="g3129">
-        <text
-           xml:space="preserve"
-           style="font-size:32px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
-           x="340"
+      <text
+         sodipodi:linespacing="125%"
+         id="text2987-3"
+         y="182.36218"
+         x="340"
+         style="font-size:32px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+         xml:space="preserve"><tspan
            y="182.36218"
-           id="text2987-3"
-           sodipodi:linespacing="125%"><tspan
-             sodipodi:role="line"
-             id="tspan2989-3"
-             x="340"
-             y="182.36218">⨝</tspan></text>
-        <text
-           xml:space="preserve"
-           style="font-size:13px;font-style:normal;font-weight:bold;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#008000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Bold"
-           x="300"
+           x="340"
+           id="tspan2989-3"
+           sodipodi:role="line">⨝</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text2991-3"
+         y="222.36218"
+         x="300"
+         style="font-size:13px;font-style:normal;font-weight:bold;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#008000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Bold"
+         xml:space="preserve"><tspan
            y="222.36218"
-           id="text2991-3"
-           sodipodi:linespacing="125%"><tspan
-             sodipodi:role="line"
-             id="tspan2993-0"
-             x="300"
-             y="222.36218">R</tspan></text>
-        <text
-           xml:space="preserve"
-           style="font-size:13px;font-style:normal;font-weight:bold;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#008000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Bold"
-           x="390"
+           x="300"
+           id="tspan2993-0"
+           sodipodi:role="line">R</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text2995-5"
+         y="222.36218"
+         x="390"
+         style="font-size:13px;font-style:normal;font-weight:bold;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#008000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Bold"
+         xml:space="preserve"><tspan
            y="222.36218"
-           id="text2995-5"
-           sodipodi:linespacing="125%"><tspan
-             sodipodi:role="line"
-             id="tspan2997-0"
-             x="390"
-             y="222.36218">S</tspan></text>
-        <path
-           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-           d="m 310,212.36219 30.00001,-20"
-           id="path2999-3"
-           inkscape:connector-curvature="0" />
-        <path
-           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-           d="m 360.00001,192.36219 30,20"
-           id="path3001-8"
-           inkscape:connector-curvature="0" />
-        <text
-           xml:space="preserve"
-           style="font-size:32px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
            x="390"
+           id="tspan2997-0"
+           sodipodi:role="line">S</tspan></text>
+      <path
+         inkscape:connector-curvature="0"
+         id="path2999-3"
+         d="m 310,212.36219 30.00001,-20"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3001-8"
+         d="m 360.00001,192.36219 30,20"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text2987-8-8"
+         y="132.36218"
+         x="390"
+         style="font-size:32px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+         xml:space="preserve"><tspan
            y="132.36218"
-           id="text2987-8-8"
-           sodipodi:linespacing="125%"><tspan
-             sodipodi:role="line"
-             id="tspan2989-7-6"
-             x="390"
-             y="132.36218">⨝</tspan></text>
-        <text
-           xml:space="preserve"
-           style="font-size:13px;font-style:normal;font-weight:bold;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#008000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Bold"
-           x="440"
+           x="390"
+           id="tspan2989-7-6"
+           sodipodi:role="line">⨝</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text2995-8-8"
+         y="172.36218"
+         x="440"
+         style="font-size:13px;font-style:normal;font-weight:bold;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#008000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Bold"
+         xml:space="preserve"><tspan
            y="172.36218"
-           id="text2995-8-8"
-           sodipodi:linespacing="125%"><tspan
-             sodipodi:role="line"
-             id="tspan2997-6-3"
-             x="440"
-             y="172.36218">B</tspan></text>
-        <path
-           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-           d="m 360.00001,162.36219 30,-20"
-           id="path2999-4-4"
-           inkscape:connector-curvature="0" />
-        <path
-           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-           d="m 410.00001,142.36219 30,20"
-           id="path3001-5-4"
-           inkscape:connector-curvature="0" />
-        <text
-           xml:space="preserve"
-           style="font-size:13px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
-           x="340"
+           x="440"
+           id="tspan2997-6-3"
+           sodipodi:role="line">B</tspan></text>
+      <path
+         inkscape:connector-curvature="0"
+         id="path2999-4-4"
+         d="m 360.00001,162.36219 30,-20"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3001-5-4"
+         d="m 410.00001,142.36219 30,20"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3312-6"
+         y="242.36218"
+         x="340"
+         style="font-size:13px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+         xml:space="preserve"><tspan
            y="242.36218"
-           id="text3312-6"
-           sodipodi:linespacing="125%"><tspan
-             sodipodi:role="line"
-             id="tspan3314-8"
-             x="340"
-             y="242.36218">Plan 3</tspan></text>
-      </g>
-      <g
-         transform="translate(-70,-40.000003)"
-         id="g3111">
-        <text
-           xml:space="preserve"
-           style="font-size:32px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
-           x="-10"
+           x="340"
+           id="tspan3314-8"
+           sodipodi:role="line">Plan 3</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text2987-6"
+         y="182.36218"
+         x="-80"
+         style="font-size:32px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+         xml:space="preserve"><tspan
+           y="182.36218"
+           x="-80"
+           id="tspan2989-1"
+           sodipodi:role="line">⨝</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text2991-9"
+         y="222.36218"
+         x="-120"
+         style="font-size:13px;font-style:normal;font-weight:bold;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#008000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Bold"
+         xml:space="preserve"><tspan
            y="222.36218"
-           id="text2987-6"
-           sodipodi:linespacing="125%"><tspan
-             sodipodi:role="line"
-             id="tspan2989-1"
-             x="-10"
-             y="222.36218">⨝</tspan></text>
-        <text
-           xml:space="preserve"
-           style="font-size:13px;font-style:normal;font-weight:bold;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#008000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Bold"
-           x="-50"
-           y="262.36218"
-           id="text2991-9"
-           sodipodi:linespacing="125%"><tspan
-             sodipodi:role="line"
-             id="tspan2993-4"
-             x="-50"
-             y="262.36218">R</tspan></text>
-        <text
-           xml:space="preserve"
-           style="font-size:13px;font-style:normal;font-weight:bold;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#008000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Bold"
-           x="40"
-           y="262.36218"
-           id="text2995-9"
-           sodipodi:linespacing="125%"><tspan
-             sodipodi:role="line"
-             id="tspan2997-7"
-             x="40"
-             y="262.36218">S</tspan></text>
-        <path
-           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-           d="m -39.999997,252.36218 30,-20"
-           id="path2999-9"
-           inkscape:connector-curvature="0" />
-        <path
-           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-           d="m 10.000003,232.36218 30,20"
-           id="path3001-2"
-           inkscape:connector-curvature="0" />
-        <text
-           xml:space="preserve"
-           style="font-size:32px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
-           x="40"
+           x="-120"
+           id="tspan2993-4"
+           sodipodi:role="line">B</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text2995-9"
+         y="222.36218"
+         x="-30"
+         style="font-size:13px;font-style:normal;font-weight:bold;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#008000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Bold"
+         xml:space="preserve"><tspan
+           y="222.36218"
+           x="-30"
+           id="tspan2997-7"
+           sodipodi:role="line">S</tspan></text>
+      <path
+         inkscape:connector-curvature="0"
+         id="path2999-9"
+         d="m -110,212.36218 30.000003,-20"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3001-2"
+         d="m -59.999997,192.36218 30,20"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text2987-8-3"
+         y="132.36218"
+         x="-30"
+         style="font-size:32px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+         xml:space="preserve"><tspan
+           y="132.36218"
+           x="-30"
+           id="tspan2989-7-8"
+           sodipodi:role="line">⨝</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text2995-8-3"
+         y="172.36218"
+         x="20"
+         style="font-size:13px;font-style:normal;font-weight:bold;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#008000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Bold"
+         xml:space="preserve"><tspan
            y="172.36218"
-           id="text2987-8-3"
-           sodipodi:linespacing="125%"><tspan
-             sodipodi:role="line"
-             id="tspan2989-7-8"
-             x="40"
-             y="172.36218">⨝</tspan></text>
-        <text
-           xml:space="preserve"
-           style="font-size:13px;font-style:normal;font-weight:bold;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#008000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Bold"
-           x="90"
-           y="212.36218"
-           id="text2995-8-3"
-           sodipodi:linespacing="125%"><tspan
-             sodipodi:role="line"
-             id="tspan2997-6-33"
-             x="90"
-             y="212.36218">B</tspan></text>
-        <path
-           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-           d="m 10.000003,202.36218 30,-20"
-           id="path2999-4-5"
-           inkscape:connector-curvature="0" />
-        <path
-           style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-           d="m 60.000003,182.36218 30,20"
-           id="path3001-5-9"
-           inkscape:connector-curvature="0" />
-        <text
-           xml:space="preserve"
-           style="font-size:13px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
-           x="-10"
-           y="282.36218"
-           id="text3312-1"
-           sodipodi:linespacing="125%"><tspan
-             sodipodi:role="line"
-             id="tspan3314-3"
-             x="-10"
-             y="282.36218">Plan 1</tspan></text>
-      </g>
+           x="20"
+           id="tspan2997-6-33"
+           sodipodi:role="line">R</tspan></text>
+      <path
+         inkscape:connector-curvature="0"
+         id="path2999-4-5"
+         d="m -59.999997,162.36218 30,-20"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3001-5-9"
+         d="m -9.999997,142.36218 30,20"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3312-1"
+         y="242.36218"
+         x="-80"
+         style="font-size:13px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+         xml:space="preserve"><tspan
+           y="242.36218"
+           x="-80"
+           id="tspan3314-3"
+           sodipodi:role="line">Plan 1</tspan></text>
     </g>
   </g>
 </svg>
diff --git a/bd/explain_plan.svg b/bd/explain_plan.svg
new file mode 100644 (file)
index 0000000..470239b
--- /dev/null
@@ -0,0 +1,306 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="330.31494"
+   height="124.87304"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="explain_plan.svg">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2.9145596"
+     inkscape:cx="52.450126"
+     inkscape:cy="82.881477"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:snap-global="true"
+     fit-margin-top="3"
+     fit-margin-left="3"
+     fit-margin-right="3"
+     fit-margin-bottom="3"
+     inkscape:window-width="1631"
+     inkscape:window-height="1026"
+     inkscape:window-x="1249"
+     inkscape:window-y="407"
+     inkscape:window-maximized="1"
+     units="pt">
+    <inkscape:grid
+       type="xygrid"
+       id="grid2985"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true"
+       originx="-107.10693px"
+       originy="-818.75391px" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-107.10693,-108.73524)">
+    <g
+       id="g3081"
+       transform="translate(0,-1.3320312e-6)"
+       style="fill:#ec1100;fill-opacity:1">
+      <text
+         sodipodi:linespacing="125%"
+         id="text2987"
+         y="192.36218"
+         x="160"
+         style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ec1100;fill-opacity:1;stroke:none;font-family:Sans"
+         xml:space="preserve"><tspan
+           y="192.36218"
+           x="160"
+           id="tspan2989"
+           sodipodi:role="line">Role</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text2991"
+         y="192.36218"
+         x="285"
+         style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ec1100;fill-opacity:1;stroke:none;font-family:Sans"
+         xml:space="preserve"><tspan
+           y="192.36218"
+           x="285"
+           id="tspan2993"
+           sodipodi:role="line" /></text>
+    </g>
+    <g
+       id="g3075"
+       transform="translate(-15.6665,-19.516785)"
+       style="fill:#14437c;fill-opacity:1">
+      <text
+         sodipodi:linespacing="125%"
+         id="text2995"
+         y="147.36218"
+         x="215"
+         style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#14437c;fill-opacity:1;stroke:none;font-family:Sans"
+         xml:space="preserve"><tspan
+           style="font-size:32px;fill:#14437c;fill-opacity:1"
+           y="147.36218"
+           x="215"
+           id="tspan2997"
+           sodipodi:role="line">⨝</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3001"
+         y="152.36218"
+         x="235"
+         style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#14437c;fill-opacity:1;stroke:none;font-family:Sans"
+         xml:space="preserve"><tspan
+           style="font-size:10px;fill:#14437c;fill-opacity:1"
+           y="152.36218"
+           x="235"
+           id="tspan3003"
+           sodipodi:role="line">role.pid = people.pid</tspan></text>
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+       x="254.32658"
+       y="112.34022"
+       id="text3013"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3015"
+         x="254.32658"
+         y="112.34022" /></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 185,177.36218 50,-40"
+       id="path3087"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 300,177.36218 -45,-40"
+       id="path3089"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <g
+       id="g3109"
+       transform="translate(-5.3601685,0.84391091)">
+      <text
+         sodipodi:linespacing="125%"
+         id="text3095"
+         y="156.85809"
+         x="341.37579"
+         style="font-size:13px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+         xml:space="preserve"><tspan
+           y="156.85809"
+           x="341.37579"
+           sodipodi:role="line"
+           id="tspan3073" /></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3101"
+         y="121.51828"
+         x="340.36017"
+         style="font-size:13px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+         xml:space="preserve"><tspan
+           y="121.51828"
+           x="340.36017"
+           id="tspan3103"
+           sodipodi:role="line">Hash Join join</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3105"
+         y="84.462944"
+         x="340.36017"
+         style="font-size:13px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+         xml:space="preserve"><tspan
+           y="84.462944"
+           x="340.36017"
+           id="tspan3107"
+           sodipodi:role="line" /></text>
+    </g>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 305.20937,216.41809 0,-25"
+       id="path3091-5"
+       inkscape:connector-curvature="0" />
+    <text
+       xml:space="preserve"
+       style="font-size:13px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+       x="110"
+       y="192.36218"
+       id="text3081-9"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         x="110"
+         y="192.36218"
+         id="tspan3089-4">Scan</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#8bb400;fill-opacity:1;stroke:none;font-family:URW Bookman L;-inkscape-font-specification:URW Bookman L"
+       x="300"
+       y="187.36218"
+       id="text3049"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3051"
+         x="300"
+         y="187.36218"
+         style="font-size:20px;font-weight:bold;-inkscape-font-specification:URW Bookman L Bold;fill:#8bb400;fill-opacity:1">#</tspan></text>
+    <g
+       id="g3081-2"
+       transform="translate(95.000001,34.999999)"
+       style="fill:#ff7f00;fill-opacity:1">
+      <text
+         sodipodi:linespacing="125%"
+         id="text2987-2"
+         y="192.36218"
+         x="195"
+         style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ff7f00;fill-opacity:1;stroke:none;font-family:Sans"
+         xml:space="preserve"><tspan
+           y="192.36218"
+           x="195"
+           id="tspan2989-7"
+           sodipodi:role="line">People</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text2991-1"
+         y="192.36218"
+         x="285"
+         style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ff7f00;fill-opacity:1;stroke:none;font-family:Sans"
+         xml:space="preserve"><tspan
+           y="192.36218"
+           x="285"
+           id="tspan2993-5"
+           sodipodi:role="line" /></text>
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-size:13px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+       x="350"
+       y="227.36218"
+       id="text3081-9-4"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         x="350"
+         y="227.36218"
+         id="tspan3089-4-5">Scan</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:URW Bookman L;-inkscape-font-specification:URW Bookman L"
+       x="284.09094"
+       y="106.9535"
+       id="text3108"
+       sodipodi:linespacing="125%"
+       transform="translate(50.417285,74.609394)"><tspan
+         sodipodi:role="line"
+         id="tspan3110"
+         x="284.09094"
+         y="106.9535" /></text>
+    <g
+       id="g3109-6"
+       transform="translate(-15.360168,60.843901)">
+      <text
+         sodipodi:linespacing="125%"
+         id="text3095-3"
+         y="156.85809"
+         x="341.37579"
+         style="font-size:13px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+         xml:space="preserve"><tspan
+           y="156.85809"
+           x="341.37579"
+           sodipodi:role="line"
+           id="tspan3073-9" /></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3101-1"
+         y="121.51828"
+         x="340.36017"
+         style="font-size:13px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+         xml:space="preserve"><tspan
+           y="121.51828"
+           x="340.36017"
+           id="tspan3103-8"
+           sodipodi:role="line">Table de hash en</tspan><tspan
+           y="137.76828"
+           x="340.36017"
+           sodipodi:role="line"
+           id="tspan3148">mémoire</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3105-9"
+         y="84.462944"
+         x="340.36017"
+         style="font-size:13px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+         xml:space="preserve"><tspan
+           y="84.462944"
+           x="340.36017"
+           id="tspan3107-3"
+           sodipodi:role="line" /></text>
+    </g>
+  </g>
+</svg>
index 28eafaa..dd5d0d5 100644 (file)
Binary files a/bd/pdf/bd04.pdf and b/bd/pdf/bd04.pdf differ
index 26cb610..3f26edb 100644 (file)
Binary files a/bd/pdf/bd04_print.pdf and b/bd/pdf/bd04_print.pdf differ
index 767466d..5e80052 100644 (file)
Binary files a/bd/pdf/bd05.pdf and b/bd/pdf/bd05.pdf differ
index 2e54095..0e96cad 100644 (file)
Binary files a/bd/pdf/bd05_print.pdf and b/bd/pdf/bd05_print.pdf differ
diff --git a/bd/pdf/bd06.pdf b/bd/pdf/bd06.pdf
new file mode 100644 (file)
index 0000000..4d8e52f
Binary files /dev/null and b/bd/pdf/bd06.pdf differ
diff --git a/bd/pdf/bd06_print.pdf b/bd/pdf/bd06_print.pdf
new file mode 100644 (file)
index 0000000..4f1fdc2
Binary files /dev/null and b/bd/pdf/bd06_print.pdf differ