Advertisement
Guest User

Solution tricheur

a guest
Nov 22nd, 2018
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ABAP 7.69 KB | None | 0 0
  1.  
  2.  
  3. S3
  4. Année 2018-2019
  5.  
  6.  
  7. Bases de données avancées
  8.  
  9. Optimisation des requêtes
  10.  
  11. Dans ce TP, nous travaillons sur la base de données des villes, régions et départements de France. Cette base de données comporte un grand nombre de données : 36684 villes, 26 régions et 100 départements ! Cette base de données a été téléchargée sur le site http://pgfoundry.org/projects/dbsamples/
  12.  
  13. L’objectif de ce TP est d’analyser les plans d’exécution des requêtes générés par l’optimiseur de Postgres et de mettre en place des mécanismes permettant d’améliorer le coût d’exécution des requêtes dans des bases de données de grades dimensions.
  14. Le schéma de cette base de données est le suivant :
  15. TOWNS (id, code, article, name, department) 
  16. REGIONS(id, code, capital, name)
  17. DEPARTMENTS(id, code, capital, region, name)
  18.  
  19. Préambule : Création de la base de données et insertion des données
  20. - Lancez un terminal (Terminal ou Konsole).
  21. - Dans votre répertoire M3106C, créez un répertoire FrenchTowns.
  22. - Dans ce sous-répertoire FrenchTowns, copier le fichier create.sql disponible dans /users/info/pub/S3/M3106C/FrenchTowns. Examinez ce fichier un peu différent des create.sql habituels…
  23.     • Dans le terminal, connectez-vous sur Postgres  par la commande
  24. psql –h postgres-info –U  users3a01  bases3a01   (par exemple)
  25.     • Supprimez toutes les tables qui ont été créées dans les TP1 et 2 afin d’obtenir une base vierge.
  26.     • Exécutez la commande \i create.sql pour créer les tables de la base de données et y insérer les données.
  27.     • Vérifiez que les tables TOWNS, REGIONS et DEPARTMENTS ont été créées  par la commande \d. Vous remarquerez que des tables de type « SEQUENCE » ont également été créées. Une séquence est une table contenant une seule ligne appelée générateur de séquence, utilisée pour générer des identifiants uniques de lignes de tables (ici les identifiants des villes, régions et départements). Ces tables séquence sont des tables utilitaires. Vous remarquerez également que des index (cf cours) ont été créés automatiquement par Postgres pour tous les attributs UNIQUE, ceci afin d’optimiser le temps d’exécution des requêtes.
  28.     • Pour répondre à certaines questions de ce TP, vous devrez effectuer certaines recherches sur la doc en ligne de Postgres : http://docs.postgresqlfr.org/
  29.  
  30. Exercice 1 : Etude des statistiques du schéma
  31. Tapez la commande suivante :
  32. SELECT relname, relpages, reltuples from pg_class order by relname ;
  33.  
  34. Question 1 : Que fait cette commande ?
  35. Consultez la doc en ligne de postgres pour trouver ce que représente :
  36.     • pg_class ?
  37.     • relpages ?
  38.     • reltuples ?
  39. Notez les résultats obtenus pour les relnames suivants : departments, departments_capital_key, departments_code_key, departments_id_key, departments_id_seq, departments_name_key, towns, towns_id_key, towns_id_seq, towns_code_department_key, regions, regions_code_key, regions_id_key, regions_id_seq, regions_name_key.
  40.  
  41. Question 2 :
  42. Afin que l’estimation du temps d’exécution d’une requête par Postgres soit le plus exact possible, il est nécessaire de mettre à jour les statistiques des tables.
  43. Pour cela, exécutez la commande ANALYZE (que fait cette commande ?)
  44.  
  45. -exécutez la commande :
  46. SELECT relname, relpages, reltuples from pg_class order by relname ;
  47. Et examinez les différences concernant les chiffres obtenus en question 1.
  48.  
  49. Exercice 2 : Etude des plans d’exécution de différents types de requêtes
  50. Dans cet exercice, nous utiliserons la commande EXPLAIN qui donne le plan d’exécution et calcule les coûts d’exécution prévus par l’optimiseur de Postgres dans le cadre d’une requête.
  51.  
  52. Question 1 : Tapez la commande suivante :
  53. EXPLAIN SELECT * FROM TOWNS ;
  54. Qu’indiquent les différents coûts générés par cette commande ?
  55. Quel est le plan d’exécution généré dans ce cas ?
  56. RECHERCHE SEQUENTIELLE (seq scan)
  57.  
  58. Question 2 : RAJOUTER UN EXPLAIN DEVANT CHAQUE REQUETE :
  59. Examinez les plans d’exécution des requêtes suivantes. Pour chaque plan d’exécution généré, dessinez sur papier l’arbre relationnel généré par l’optimiseur de Postgres et notez les résultats :
  60.     1. Code et noms des villes de France
  61. SELECT code, name
  62. FROM TOWNS ;
  63. TOUJOURS RECHERCHE SEQUENTIELLE (seq scan) mais width moins important car on ne récupère que le code et le name, pas tous les attributs.
  64.  
  65.     2. Noms, départements et régions de toutes les villes de France
  66. SELECT T.name, department, region
  67. FROM TOWNS T, DEPARTMENTS D
  68. WHERE T.department = D.code ;
  69. Effectuer une recherche sur internet pour comprendre ce que représentent « hash join » et « hash cond »
  70.  
  71.     3. Noms et départements des villes de la région Rhône-Alpes (avec une jointure)
  72. SELECT D.name, department
  73. FROM TOWNS T, DEPARTMENTS D
  74. WHERE T.department = D.code and region = ‘Rhône-Alpes’ ;
  75.  
  76.     4. Noms et départements des villes de la région Rhône-Alpes (avec une requête imbriquée). Comparer cette version avec requête imbriquée avec la version précédente (question 3) sans requête imbriquée.
  77.  
  78. SELECT name, department
  79. FROM TOWNS
  80. WHERE department IN (SELECT code FROM DEPARTMENTS WHERE region = ‘Rhône-Alpes’) ;
  81.  
  82.     5. Nombre de villes de France. Comparer avec la question 1.
  83. SELECT count(*)
  84. FROM TOWNS ;
  85.  
  86.     6. Nombre de villes par département. Comparer avec la question 5. Effectuer une recherche sur internet pour comprendre ce que représente « hashAggregate »
  87. SELECT department, count(*)
  88. FROM TOWNS
  89. GROUP BY department ;
  90.  
  91.  
  92.     7. Nombre de départements par région
  93. SELECT region, count(*)
  94. FROM DEPARTMENTS
  95. GROUP BY region ;
  96.  
  97.     8. Nombre de départements par région, pour les régions comportant plus de 5 départements. Comparer avec la question 7.
  98. SELECT region, count(*)
  99. FROM DEPARTMENTS
  100. GROUP BY region
  101. HAVING count(*) > 5 ;
  102.  
  103. Exercice 3 : Index et plan d’exécution
  104. On rappelle la commande de création d’un index :
  105. CREATE [UNIQUE] INDEX nom_index ON nom_table(liste_attributs) ;
  106.  
  107. Question 1 :
  108. Examinez le plan d’exécution de la requête
  109. SELECT * FROM TOWNS where name = ‘Grenoble’ ;   (noter les résultats)
  110. Un index a-t-il été créé par Posgres sur l’attribut name de la relation TOWNS ? Pourquoi ?
  111. NON car name n’est pas unique dans TOWNS.
  112.  
  113. Créez un index sur l’attribut name de TOWNS, puis ré-examinez le plan d’exécution de la requête ci-dessus.
  114. Que notez-vous ?
  115. Plus rapide et recherche indexée (index scan) plutot que recherche séquentielle.
  116.  
  117. Question 2 :
  118. Cette question est basée sur la requête suivante :
  119.     SELECT towns.code, towns.name
  120.     FROM   towns, departments
  121.     WHERE  towns.department = departments.code
  122.       AND  departments.name =Isère’ ;
  123.  
  124. Exécutez cette requête et vérifiez les résultats.
  125.  
  126. Comparez les plans d’exécution générés par l’optimiseur de Postgres dans les cas suivants :
  127.     • Cas par défaut, avec les index générés par postgres
  128.     • Sans index (vous devrez préalablement supprimer tous les index générés par Postgres par la commande DROP INDEX nomIndex ou par la commande ALTER TABLE nomtable DROP CONSTRAINT nomcontrainte).
  129.     • Index sur departments.name (vous devrez donc re-créer un nouvel index)
  130.     • Index sur departments.code (vous devrez donc re-créer un nouvel index)
  131.     • Index sur departments.code et towns.department (vous devrez donc re-créer deux nouveaux index)
  132.     • Index sur departments.code, towns.department et departments.name vous devrez donc re-créer trois nouveaux index)
  133.     • …
  134.  
  135. Quelles différences voyez-vous entre les plans d’exécution ainsi générés ?
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement