site:enseignement:master:bdr:tmejointurerepartie
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Prochaine révision | Révision précédente | ||
| site:enseignement:master:bdr:tmejointurerepartie [04/01/2016 18:20] – créée hubert | site:enseignement:master:bdr:tmejointurerepartie [20/03/2019 14:05] (Version actuelle) – [3) Requêtes réparties] hubert | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| - | ====== TME jointure répartie ====== | + | {{indexmenu_n> |
| + | ====== TME Jointure répartie ====== | ||
| + | /* | ||
| lire le [[ http:// | lire le [[ http:// | ||
| + | */ | ||
| + | |||
| + | |||
| + | L' | ||
| + | entre 2 relations qui sont situées sur 2 sites distincts. | ||
| + | * Définir le schéma global qui offre un accès transparent à des données de plusieurs bases, | ||
| + | * Formuler une requête répartie, | ||
| + | * Comprendre l' | ||
| + | |||
| + | ==== Scénario ==== | ||
| + | <code bash> | ||
| + | cd <votre repertoire de travail> | ||
| + | tar zxvf / | ||
| + | cd tmeJointureRep | ||
| + | emacs tmeJR.sql & | ||
| + | </ | ||
| + | |||
| + | On dispose de deux SGBD hébergés sur des sites différents | ||
| + | * Le site 1 s' | ||
| + | <code sql> | ||
| + | -- se connecter en remplaçant 1234567 par votre numéro d' | ||
| + | CONNECT E1234567/ | ||
| + | -- vérifier que la connexion est correcte. Le nom du SGBD qui doit s' | ||
| + | select sys_context(' | ||
| + | |||
| + | </ | ||
| + | |||
| + | * Le site 2 s' | ||
| + | <code sql> | ||
| + | -- se connecter en remplaçant 1234567 par votre numéro d' | ||
| + | CONNECT E1234567/ | ||
| + | -- vérifier que la connexion est correcte. Le nom du SGBD qui doit s' | ||
| + | select sys_context(' | ||
| + | </ | ||
| + | |||
| + | ====Données ==== | ||
| + | * Le site 1 **ora11** contient les Clubs dans la table **Club**(cnum, | ||
| + | |||
| + | * le site 2 **ora10** contient les Joueurs dans la table **Stagiaire**(licence, | ||
| + | La couche BDR est implémentée sur le site 1 appelé **ora11** | ||
| + | |||
| + | |||
| + | |||
| + | =====1) Installation ===== | ||
| + | |||
| + | Créer la table Club sur le site 1 | ||
| + | <code sql> | ||
| + | CONNECT ... @ora11 | ||
| + | @tableClub | ||
| + | desc Club | ||
| + | </ | ||
| + | |||
| + | Créer la table Stagiaire sur le site 2 | ||
| + | <code sql> | ||
| + | connect ... @ora10 | ||
| + | @tableStagiaire | ||
| + | desc Stagiaire | ||
| + | </ | ||
| + | |||
| + | |||
| + | Relier les sites : La couche BDR (site1) doit pouvoir se connecter au site 2 | ||
| + | <code sql> | ||
| + | connect ... @ora11 | ||
| + | drop database link site2; | ||
| + | -- remplacer 1234567 par votre numéro d' | ||
| + | create database link site2 connect to E1234567 identified by " | ||
| + | | ||
| + | </ | ||
| + | |||
| + | Vérifier le bon fonctionnement du lien | ||
| + | <code sql> | ||
| + | connect ... @ora11 | ||
| + | desc Stagiaire@site2 | ||
| + | </ | ||
| + | |||
| + | /* OLD | ||
| + | Ajouter un club dans une nouvelle ville. Ce club n'a que 10 joueurs ce qui permettra, par la suite, de poser une requête de jointure très sélective. | ||
| + | <code sql> | ||
| + | connect ... @ora11 | ||
| + | | ||
| + | </ | ||
| + | */ | ||
| + | |||
| + | ===== 2) Construire le schéma global===== | ||
| + | <code sql> | ||
| + | CONNECT ... @ora11 | ||
| + | create view Stagiaire as | ||
| + | select * | ||
| + | from Stagiaire@site2; | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== 3) Requêtes réparties===== | ||
| + | |||
| + | Pour chaque requête, répondre aux questions | ||
| + | * Où est traitée chaque opération (sélection, | ||
| + | * Quelles sont les données transférées entre les sites pendant l' | ||
| + | |||
| + | /* | ||
| + | * Activer le mode de visualisation des plans et le chronométrage | ||
| + | < | ||
| + | set timing on | ||
| + | set autotrace trace explain stat | ||
| + | </ | ||
| + | */ | ||
| + | |||
| + | === R1 : Jointure seule avec un transfert volumineux === | ||
| + | |||
| + | Afficher les stagiaires avec leur club | ||
| + | <code sql> | ||
| + | connect ... @ora11 | ||
| + | EXPLAIN plan FOR | ||
| + | SELECT s.prenom, s.profil, c.division | ||
| + | FROM Stagiaire s, Club c | ||
| + | WHERE s.cnum = c.cnum; | ||
| + | @p5 | ||
| + | </ | ||
| + | |||
| + | === R2 : Jointure avec sélection === | ||
| + | <code sql> | ||
| + | set linesize 120 | ||
| + | EXPLAIN plan FOR | ||
| + | SELECT s.prenom, s.profil, c.division | ||
| + | FROM Stagiaire s, Club c | ||
| + | WHERE s.cnum = c.cnum | ||
| + | AND s.salaire > 59000; | ||
| + | @p5 | ||
| + | </ | ||
| + | |||
| + | La sélection est-elle poussée sur le site 2 ? | ||
| + | |||
| + | |||
| + | === R3 Jointure très sélective === | ||
| + | * R3a : Jointure très sélective et avec un transfert volumineux | ||
| + | <code sql> | ||
| + | EXPLAIN plan FOR | ||
| + | SELECT s.prenom, s.profil, c.division | ||
| + | FROM Stagiaire s, Club c | ||
| + | WHERE s.cnum = c.cnum | ||
| + | AND c.ville = ' | ||
| + | @p5 | ||
| + | </ | ||
| + | |||
| + | * R3b : jointure très sélective et avec un transfert faible. | ||
| + | La directive **driving_site** prend en argument le nom de la variable //s// associée à la table // | ||
| + | <code sql> | ||
| + | EXPLAIN plan FOR | ||
| + | SELECT /*+ driving_site(s) */ s.prenom, s.profil, c.division | ||
| + | FROM Stagiaire s, Club c | ||
| + | WHERE s.cnum = c.cnum | ||
| + | AND c.ville = ' | ||
| + | @p5 | ||
| + | </ | ||
| + | |||
| + | ===R4 : jointure et sélection avec index=== | ||
| + | Dans le site 2, créer un index sur Stagiaire(cnum). | ||
| + | |||
| + | <code sql> | ||
| + | CONNECT ... @ora10 | ||
| + | create index .... | ||
| + | @liste | ||
| + | </ | ||
| + | |||
| + | |||
| + | Montrer que l' | ||
| + | |||
| + | Pourquoi l' | ||
| + | |||
| + | /*pour illustrer les optimisations de requêtes réparties vues en cours.*/ | ||
| + | ===R5: Proposer une requête avec 2 jointures entre 3 tables === | ||
| + | La première jointure traitée le site 2, la 2ème jointure sur le site 1. | ||
| + | |||
| + | ===R6: Proposer une requete avec 1 jointure entre deux table traitée par semi-jointure=== | ||
| + | Ajouter sur le site 1 une table Match(licence, | ||
| + | |||
| + | * transférer **le numéro de licence** des joueurs ayant fait un match en 2018 du site 1 vers le site 2. Ne **pas** transférer les commentaires des matchs. | ||
| + | * transférer les joueurs satisfaisant la requête du site 2 vers le site 1. | ||
| + | * finir le calcul de la requête sur le site 1 | ||
| + | |||
| + | ===== 4) Durée des transferts ===== | ||
| + | Chronométrer les transferts en répétant n fois (n=10) l' | ||
| + | |||
| + | Pour mesurer principalement les transferts de données entre les sites et non la durée d' | ||
| + | |||
| + | Comparer les deux exécution suivantes a) et b). Laquelle est la plus rapide ? Est elle beaucoup plus rapide ? | ||
| + | * a) Avec transfert de tous les Stagiaires | ||
| + | |||
| + | <code plsql> | ||
| + | set timing on | ||
| + | declare | ||
| + | res number; | ||
| + | begin | ||
| + | for i in 1 .. 10 loop | ||
| + | | ||
| + | into res | ||
| + | FROM Stagiaire s, Club c | ||
| + | WHERE s.cnum = c.cnum | ||
| + | AND c.ville = ' | ||
| + | end loop; | ||
| + | end; | ||
| + | / | ||
| + | set timing off | ||
| + | </ | ||
| + | |||
| + | * b) Avec transfert des clubs de la ville7 | ||
| + | <code plsql> | ||
| + | set timing on | ||
| + | declare | ||
| + | res number; | ||
| + | begin | ||
| + | for i in 1 .. 10 loop | ||
| + | SELECT /*+ driving_site(s) */ max(length(s.profil)) | ||
| + | into res | ||
| + | FROM Stagiaire s, Club c | ||
| + | WHERE s.cnum = c.cnum | ||
| + | AND c.ville = ' | ||
| + | end loop; | ||
| + | end; | ||
| + | / | ||
| + | set timing off | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | ===== 5) Fragmentation===== | ||
| + | |||
| + | /* | ||
| + | TODO: solution à rédiger | ||
| + | */ | ||
| + | |||
| + | |||
| + | * Fragmenter les Club par division : placer les clubs de première division sur le site 1 (table Club1) et ceux de deuxième division sur le site 2 (table Club2). | ||
| + | * Définir la **vue** Club réunissant tous les clubs des deux divisions. | ||
| + | * Est-ce que les 2 fragments sont accédés pour une requête affichant seulement les clubs de 1ère division ? Pourquoi ? | ||
| + | <code sql> | ||
| + | select * | ||
| + | from Club c | ||
| + | where c.division=1 | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | ===== Divers ===== | ||
| + | |||
| + | |||
| + | Aller vers [[site: | ||
| + | |||
site/enseignement/master/bdr/tmejointurerepartie.1451928020.txt.gz · Dernière modification : de hubert
