Update README
This commit is contained in:
parent
4d075b50b7
commit
ae44785c57
1 changed files with 120 additions and 0 deletions
120
README.md
120
README.md
|
@ -1,6 +1,15 @@
|
||||||
Projet INSEE -- base de données avancée
|
Projet INSEE -- base de données avancée
|
||||||
---------------------------------------
|
---------------------------------------
|
||||||
|
|
||||||
|
Ce projet est disponible sur notre serveur git [à cette
|
||||||
|
adresse](https://git.epha.se/ephase/projet_INSEE). Le projet va continuer à
|
||||||
|
vivre après le rendu. En effet nos obligations professionnelles[^note] ont joué
|
||||||
|
contre nous et on a manqué de temps malgrès notre travail acahné pour produire
|
||||||
|
des élements de qualité.
|
||||||
|
|
||||||
|
[^note]:notamment une semaine d'astreinte ou il y a eu des interventions 3 nuits
|
||||||
|
de rang
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
Il est vivement conseiller de faire fonctionner ce projet dans un
|
Il est vivement conseiller de faire fonctionner ce projet dans un
|
||||||
|
@ -155,3 +164,114 @@ L'utilisation du script est simple:
|
||||||
```
|
```
|
||||||
./create_trigger.py
|
./create_trigger.py
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Question 5: Trigger avancés
|
||||||
|
|
||||||
|
Le script `create_advanced_trigger.py` permet de répondre à la question 6. Il
|
||||||
|
permet de créer une seconde procédure pour mettre à jour les colonnes
|
||||||
|
*population* de nos tables *departement* et *région* en fonction des
|
||||||
|
informations de la table *commune*.
|
||||||
|
|
||||||
|
L'utilisation du script est simple:
|
||||||
|
|
||||||
|
```
|
||||||
|
./create_advanced_trigger.py
|
||||||
|
```
|
||||||
|
|
||||||
|
Vous remarquerez que nous acvons créé une nouvelle fonction `fun_mag_pop_2` et
|
||||||
|
`prc_pop_reg_dep_2` au lieu de remplacer les anciennent. Ce n;est pas optimisé
|
||||||
|
mais le maue de temps nous a poussé à laisser tel quel.
|
||||||
|
|
||||||
|
## Question 6: EXPLAIN Afin d'étudier le fonctionnement de l;ordonnanceur de
|
||||||
|
PostGreSQL, nous avons exécuter trois requêtes de taille différente que se soit
|
||||||
|
en terme de jointures ou de nombre de ligne retournées.
|
||||||
|
|
||||||
|
```sql
|
||||||
|
-- petite requête : une jointure
|
||||||
|
explain SELECT ID_REGION, r.REG, r.NCC,d.DEP
|
||||||
|
FROM INSEE.REGION r
|
||||||
|
INNER JOIN INSEE.DEPARTEMENT d ON d.REG = r.REG
|
||||||
|
WHERE r.NCC = 'BRETAGNE';
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
QUERY PLAN
|
||||||
|
Hash Join (cost=1.24..6.58 rows=6 width=23)
|
||||||
|
Hash Cond: ((d.reg)::text = (r.reg)::text)
|
||||||
|
-> Seq Scan on departement d (cost=0.00..5.01 rows=101 width=6)
|
||||||
|
-> Hash (cost=1.23..1.23 rows=1 width=20)
|
||||||
|
-> Seq Scan on region r (cost=0.00..1.23 rows=1 width=20)
|
||||||
|
Filter: ((ncc)::text = 'BRETAGNE'::text)
|
||||||
|
```
|
||||||
|
|
||||||
|
```sql
|
||||||
|
-- requête moyenne : deux jointures
|
||||||
|
explain SELECT ID_REGION, r.REG, r.NCC
|
||||||
|
FROM INSEE.REGION r
|
||||||
|
INNER JOIN INSEE.DEPARTEMENT d ON d.REG = r.REG
|
||||||
|
INNER JOIN INSEE.COMMUNE c ON c.DEP = d.DEP
|
||||||
|
GROUP BY ID_REGION,r.REG, r.NCC;
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
QUERY PLAN
|
||||||
|
HashAggregate (cost=990.76..990.94 rows=18 width=20)
|
||||||
|
Group Key: r.id_region
|
||||||
|
-> Hash Join (cost=7.68..903.35 rows=34965 width=20)
|
||||||
|
Hash Cond: ((d.reg)::text = (r.reg)::text)
|
||||||
|
-> Hash Join (cost=6.27..788.55 rows=34965 width=3)
|
||||||
|
Hash Cond: ((c.dep)::text = (d.dep)::text)
|
||||||
|
-> Seq Scan on commune c (cost=0.00..686.65 rows=34965 width=3)
|
||||||
|
-> Hash (cost=5.01..5.01 rows=101 width=6)
|
||||||
|
-> Seq Scan on departement d (cost=0.00..5.01 rows=101 width=6)
|
||||||
|
-> Hash (cost=1.18..1.18 rows=18 width=20)
|
||||||
|
-> Seq Scan on region r (cost=0.00..1.18 rows=18 width=20)
|
||||||
|
```
|
||||||
|
|
||||||
|
```sql
|
||||||
|
-- grosse : trois jointures avec la table STATISTIQUES qui contient beaucoup de données
|
||||||
|
explain SELECT ID_REGION, r.REG, r.NCC, s.ID_INDICATEUR, s.DATE_DEBUT, SUM(s.VALEUR)
|
||||||
|
FROM INSEE.REGION r
|
||||||
|
INNER JOIN INSEE.DEPARTEMENT d ON d.REG = r.REG
|
||||||
|
INNER JOIN INSEE.COMMUNE c ON c.DEP = d.DEP
|
||||||
|
INNER JOIN INSEE.STATISTIQUE s ON s.COM = c.COM
|
||||||
|
GROUP BY ID_REGION,r.REG, s.DATE_DEBUT, r.NCC, s.ID_INDICATEUR
|
||||||
|
ORDER BY ID_INDICATEUR;
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
QUERY PLAN
|
||||||
|
Finalize GroupAggregate (cost=26461.68..26660.78 rows=756 width=34)
|
||||||
|
Group Key: s.id_indicateur, r.id_region, s.date_debut
|
||||||
|
-> Gather Merge (cost=26461.68..26638.10 rows=1512 width=34)
|
||||||
|
Workers Planned: 2
|
||||||
|
-> Sort (cost=25461.66..25463.55 rows=756 width=34)
|
||||||
|
Sort Key: s.id_indicateur, r.id_region, s.date_debut
|
||||||
|
-> Partial HashAggregate (cost=25417.95..25425.51 rows=756 width=34)
|
||||||
|
Group Key: s.id_indicateur, r.id_region, s.date_debut
|
||||||
|
-> Hash Join (cost=1131.39..19884.52 rows=553343 width=34)
|
||||||
|
Hash Cond: ((d.reg)::text = (r.reg)::text)
|
||||||
|
-> Hash Join (cost=1129.99..18088.60 rows=553343 width=17)
|
||||||
|
Hash Cond: ((c.dep)::text = (d.dep)::text)
|
||||||
|
-> Hash Join (cost=1123.71..16568.85 rows=553343 width=17)
|
||||||
|
Hash Cond: ((s.com)::text = (c.com)::text)
|
||||||
|
-> Parallel Seq Scan on statistique s (cost=0.00..13992.43 rows=553343 width=20)
|
||||||
|
-> Hash (cost=686.65..686.65 rows=34965 width=9)
|
||||||
|
-> Seq Scan on commune c (cost=0.00..686.65 rows=34965 width=9)
|
||||||
|
-> Hash (cost=5.01..5.01 rows=101 width=6)
|
||||||
|
-> Seq Scan on departement d (cost=0.00..5.01 rows=101 width=6)
|
||||||
|
-> Hash (cost=1.18..1.18 rows=18 width=20)
|
||||||
|
-> Seq Scan on region r (cost=0.00..1.18 rows=18 width=20)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
* Plus le nombre de jointure est importante et plus la requête va être longue à
|
||||||
|
s'exécuter et coûteuse. C'est même la première source de consommation de
|
||||||
|
ressource pour des jointures impliquant le plus de lignes dans nos exemples.
|
||||||
|
|
||||||
|
* Le nombre de ligne dans les tables jouent également sur le temps d’exécution
|
||||||
|
et le coût qu'elle génère.
|
||||||
|
|
||||||
|
* Il faut prioriser de petites requête en évitant des jointure inutile en
|
||||||
|
utilisant un EXISTS par exemple.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue