From: Kim Nguyễn Date: Mon, 13 Apr 2015 10:46:46 +0000 (+0200) Subject: . X-Git-Url: http://git.nguyen.vg/gitweb/?p=hacks%2FsimpleWebSlides.git;a=commitdiff_plain;h=29cfcc26c54690539c4092882e9d47c4f745a211 . --- diff --git a/bd/bd06.xhtml b/bd/bd06.xhtml new file mode 100644 index 0000000..feb370b --- /dev/null +++ b/bd/bd06.xhtml @@ -0,0 +1,229 @@ + +∈"> + ∉"> + + +] + > + + + Prise en main de Postgresql + + + + + + + + + + + + + + + + + + + + +
+

Bases de données

+

Polytech Paris-Sud

+

Apprentis 4ème année

+

Cours 6 : Prise en main de Postgresql

+
kn@lri.fr
+ http://www.lri.fr/~kn +
+ +

Base d'exemple

+
+

On considère la base d'exemple suivante

+ + CREATE TABLE PEOPLE (pid INTEGER PRIMARY key, + firstname VARCHAR(30), + lastname VARCHAR(30)); + + CREATE TABLE MOVIE (mid INTEGER PRIMARY KEY, + 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), + PRIMARY KEY(mid, pid, name)); + + CREATE TABLE DIRECTOR (mid INTEGER REFERENCES MOVIE, + pid INTEGER REFERENCES PEOPLE, + PRIMARY KEY (mid, pid)); + +
+

EXPLAIN

+
+

EXPLAIN ANALYSE

+

On peut demander à Postgresql d'afficher le plan qu'il calcule pour + une requête avec les esitmations de coût : +

+ EXPLAIN requête; +

Dans ce cas, la requête n'est pas évaluée. On peut aussi évaluer la + requête :

+ EXPLAIN ANALYSE requête; +

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

+ +
+ +
+

EXPLAIN ANALYSE (suite)

+

On considère:

+ + EXPLAIN ANALYSE SELECT * FROM ROLE,PEOPLE WHERE + ROLE.pid = PEOPLE.pid; + +

On obtient :

+ 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) + +
+
+

EXPLAIN ANALYSE (suite)

+ +Seq Scan on people (cost=0.00..175.92 rows=10892 width=17) + (actual time=0.015..5.944 rows=10892 loops=1) + + +
+
+

Estimation des coût

+ + (cost=0.00..175.92 rows=10892 width=17) + + +
+
+

Coût réel

+ + (actual time=0.015..5.944 rows=10892 loops=1) + + +
+
+

Lecture du plan de requête

+ + Hash Join (cost=…) (actual time=…) + Hash Cond: (role.pid = people.pid) + -> Seq Scan on role (cost=…) (actual time=…) + -> Hash (cost=…) (actual time=…) + -> Seq Scan on people (cost=…) (actual time=…) + + +

+explain +

+

Note: les projections n'apparaissent pas, on peut les voir + avec EXPLAIN ANALYSE VERBOSE.

+
+

Exemples d'opérateurs

+
+

Nœuds fréquements rencontrés lors d'un EXPLAIN ANALYSE

+

Les opérateurs sont déclinés selon les différents algorithmes + (jointure, tris, …)

+ + + +
+
+

Retour sur les opératuers « Bitmap »

+

(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 +

+

Solution en deux phases

+ +

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).

+

Cela permet aussi de répondre efficacement aux requêtes + booléenes complexes (i.e. autre qu AND). En effet on + calcule un bitmap pour chaque sous-condition, et on fait les + opérations entre bitmap bit à bit. +

+
+

Démo

+ + diff --git a/bd/explain_plan.svg b/bd/explain_plan.svg new file mode 100644 index 0000000..470239b --- /dev/null +++ b/bd/explain_plan.svg @@ -0,0 +1,306 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + Role + + + + ⨝ + role.pid = people.pid + + + + + + + Hash Join join + + + + Scan + # + + People + + + Scan + + + + Table de hash enmémoire + + + + diff --git a/bd/pdf/bd06.pdf b/bd/pdf/bd06.pdf new file mode 100644 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 index 0000000..4f1fdc2 Binary files /dev/null and b/bd/pdf/bd06_print.pdf differ