diff --git a/README.md b/README.md index 80637f8..eade64a 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,6 @@ 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 Il est vivement conseiller de faire fonctionner ce projet dans un @@ -164,114 +155,3 @@ L'utilisation du script est simple: ``` ./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. diff --git a/create_database.py b/create_database.py index 21f3362..c59c58b 100755 --- a/create_database.py +++ b/create_database.py @@ -54,6 +54,7 @@ def parse_args(): if __name__ == '__main__': args = parse_args() + t = Timer() #logging.basicConfig(level=logging.DEBUG) logger = logging.getLogger() tty_handler = logging.StreamHandler() @@ -70,7 +71,6 @@ if __name__ == '__main__': logger.setLevel(logging.DEBUG) logger.debug('DEBUG mode activated') - t = Timer(logger=logger.info) logging.debug('Import pgsql connection file {}'.format(args.connection_file)) with open(args.connection_file) as cf: pg_conn = cf.read() diff --git a/create_trigger.py b/create_trigger.py index d9d8ea8..b7e58bb 100755 --- a/create_trigger.py +++ b/create_trigger.py @@ -143,7 +143,7 @@ if __name__ == '__main__': END IF; ALTER TABLE %(schema)s.region ENABLE TRIGGER TRG_BLOQ_MAJ_REG; - ALTER TABLE %(schema)s.departement ENABLE TRIGGER TRG_BLOQ_MAJ_DEP; + ALTER TABLE %(schema)s.region ENABLE TRIGGER TRG_BLOQ_MAJ_DEP; RETURN NULL; END; diff --git a/create_view.py b/create_view.py index 4dda116..5bcad4a 100755 --- a/create_view.py +++ b/create_view.py @@ -62,6 +62,7 @@ def parse_args(): if __name__ == '__main__': args = parse_args() + t = Timer() #logging.basicConfig(level=logging.DEBUG) logger = logging.getLogger() tty_handler = logging.StreamHandler() @@ -78,8 +79,6 @@ if __name__ == '__main__': logger.setLevel(logging.DEBUG) logger.debug('DEBUG mode activated') - t = Timer(logger=logger.info) - logging.debug('Import pgsql connection file {}'.format(args.connection_file)) with open(args.connection_file) as cf: pg_conn = cf.read()