site:enseignement:master:bdr:tmejointurerepartie
Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
site:enseignement:master:bdr:tmejointurerepartie [06/03/2018 10:23] – [TME Jointure répartie] hubert | site:enseignement:master:bdr:tmejointurerepartie [20/03/2019 14:05] (Version actuelle) – [3) Requêtes réparties] hubert | ||
---|---|---|---|
Ligne 9: | Ligne 9: | ||
L' | L' | ||
entre 2 relations qui sont situées sur 2 sites distincts. | entre 2 relations qui sont situées sur 2 sites distincts. | ||
- | * définir | + | * Définir |
- | * formuler | + | * Formuler |
- | * comprendre | + | * Comprendre |
- | === Scénario === | + | ==== Scénario |
<code bash> | <code bash> | ||
cd <votre repertoire de travail> | cd <votre repertoire de travail> | ||
Ligne 22: | Ligne 22: | ||
On dispose de deux SGBD hébergés sur des sites différents | On dispose de deux SGBD hébergés sur des sites différents | ||
- | * Le site 1 s' | + | * Le site 1 s' |
<code sql> | <code sql> | ||
- | CONNECT E1234567/ | + | -- se connecter en remplaçant |
- | -- vérifier la connexion | + | CONNECT E1234567/ |
+ | -- vérifier | ||
select sys_context(' | select sys_context(' | ||
- | -- doit afficher oracle | ||
</ | </ | ||
- | * Le site 2 s' | + | * Le site 2 s' |
<code sql> | <code sql> | ||
- | CONNECT E1234567/ | + | -- se connecter en remplaçant |
+ | CONNECT E1234567/ | ||
+ | -- vérifier que la connexion est correcte. Le nom du SGBD qui doit s' | ||
select sys_context(' | select sys_context(' | ||
- | -- doit afficher ora10 | ||
</ | </ | ||
- | Données: | + | ====Données |
* Le site 1 **ora11** contient les Clubs dans la table **Club**(cnum, | * Le site 1 **ora11** contient les Clubs dans la table **Club**(cnum, | ||
* le site 2 **ora10** contient les Joueurs dans la table **Stagiaire**(licence, | * le site 2 **ora10** contient les Joueurs dans la table **Stagiaire**(licence, | ||
- | La couche BDR est implémentée sur le site 1 ora11 | + | La couche BDR est implémentée sur le site 1 appelé **ora11** |
- | ==== Installation ==== | + | =====1) Installation |
Créer la table Club sur le site 1 | Créer la table Club sur le site 1 | ||
Ligne 67: | Ligne 68: | ||
connect ... @ora11 | connect ... @ora11 | ||
drop database link site2; | drop database link site2; | ||
- | create database link site2 connect to E1234567 identified by " | + | |
+ | | ||
+ | | ||
</ | </ | ||
Ligne 84: | Ligne 87: | ||
*/ | */ | ||
- | ==== Construire le schéma global==== | + | ===== 2) Construire le schéma global===== |
<code sql> | <code sql> | ||
CONNECT ... @ora11 | CONNECT ... @ora11 | ||
Ligne 93: | Ligne 96: | ||
- | ==== Requêtes réparties==== | + | ===== 3) Requêtes réparties===== |
Pour chaque requête, répondre aux questions | Pour chaque requête, répondre aux questions | ||
Ligne 107: | Ligne 110: | ||
*/ | */ | ||
- | == R1 : Jointure seule avec un transfert volumineux == | + | === R1 : Jointure seule avec un transfert volumineux |
- | Afficher les joueurs | + | Afficher les stagiaires |
<code sql> | <code sql> | ||
connect ... @ora11 | connect ... @ora11 | ||
Ligne 119: | Ligne 122: | ||
</ | </ | ||
- | == R2 : jointure | + | === R2 : Jointure |
<code sql> | <code sql> | ||
set linesize 120 | set linesize 120 | ||
Ligne 133: | Ligne 136: | ||
- | == R3 Jointure très sélective == | + | === R3 Jointure très sélective |
- | * R3a : jointure | + | * R3a : Jointure |
<code sql> | <code sql> | ||
EXPLAIN plan FOR | EXPLAIN plan FOR | ||
Ligne 140: | Ligne 143: | ||
FROM Stagiaire s, Club c | FROM Stagiaire s, Club c | ||
WHERE s.cnum = c.cnum | WHERE s.cnum = c.cnum | ||
- | AND c.ville = 'Paris'; | + | AND c.ville = 'ville7'; |
@p5 | @p5 | ||
</ | </ | ||
* R3b : jointure très sélective et avec un transfert faible. | * R3b : jointure très sélective et avec un transfert faible. | ||
- | La directive **driving_site** prend en argument le nom de la variable //j1// associée à la relation | + | La directive **driving_site** prend en argument le nom de la variable //s// associée à la table // |
<code sql> | <code sql> | ||
EXPLAIN plan FOR | EXPLAIN plan FOR | ||
- | SELECT /*+ driving_site(j1) */ s.prenom, s.profil, c.division | + | SELECT /*+ driving_site(s) */ s.prenom, s.profil, c.division |
FROM Stagiaire s, Club c | FROM Stagiaire s, Club c | ||
WHERE s.cnum = c.cnum | WHERE s.cnum = c.cnum | ||
- | AND c.ville = 'Paris'; | + | AND c.ville = 'ville7'; |
@p5 | @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 | ||
+ | </ | ||
+ | |||
- | ==Proposer d' | ||
site/enseignement/master/bdr/tmejointurerepartie.1520328224.txt.gz · Dernière modification : de hubert