Ceci est une ancienne révision du document !
L'objectif de ce TME est de comprendre l'évaluation d'une requête de jointure entre 2 relations qui sont situées sur 2 sites distincts.
cd <votre repertoire de travail> tar zxvf /Infos/bd/public/tmeJointureRep.tgz cd tmeJointureRep emacs tmeJR.sql &
On dispose de deux SGBD hébergés sur des sites différents
-- se connecter en remplaçant 1234567 par votre numéro d'étudiant CONNECT E1234567/E1234567@ora11 -- vérifier la connexion en affichant le nom du SGBD : SELECT sys_context('USERENV', 'INSTANCE_NAME') FROM dual; -- doit afficher oracle
-- se connecter en remplaçant 1234567 par votre numéro d'étudiant CONNECT E1234567/E1234567@ora10 SELECT sys_context('USERENV', 'INSTANCE_NAME') FROM dual; -- doit afficher ora10
La couche BDR est implémentée sur le site 1 appelé ora11
Créer la table Club sur le site 1
CONNECT ... @ora11 @tableClub DESC Club
Créer la table Stagiaire sur le site 2
CONNECT ... @ora10 @tableStagiaire DESC Stagiaire
Relier les sites : La couche BDR (site1) doit pouvoir se connecter au site 2
CONNECT ... @ora11 DROP DATABASE link site2; -- remplacer 1234567 par votre numéro d'étudiant CREATE DATABASE link site2 CONNECT TO E1234567 IDENTIFIED BY "E1234567" USING 'ora10';
Vérifier le bon fonctionnement du lien
CONNECT ... @ora11 DESC Stagiaire@site2
CONNECT ... @ora11 CREATE VIEW Stagiaire AS SELECT * FROM Stagiaire@site2;
Pour chaque requête, répondre aux questions
Afficher les joueurs avec leur club
CONNECT ... @ora11 EXPLAIN plan FOR SELECT s.prenom, s.profil, c.division FROM Stagiaire s, Club c WHERE s.cnum = c.cnum; @p5
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 ?
EXPLAIN plan FOR SELECT s.prenom, s.profil, c.division FROM Stagiaire s, Club c WHERE s.cnum = c.cnum AND c.ville = 'ville7'; @p5
La directive driving_site prend en argument le nom de la variable s associée à la table Stagiaire stockée sur le site dans lequel oracle doit traiter la jointure. Autrement dit, Oracle doit traiter la jointure sur le site 2 contenant Stagiaire.
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 = 'ville7'; @p5
* R4 : jointure et sélection avec index. Dans le site 2, créer un index sur Stagiaire(cnum). Afficher le plan de R2 (sélection sur le salaire). Vérifier que l'index Stagiaire(cnum) est utilisé. Expliquer le plan.
Chronométrer les transferts en répétant n fois (n=10) l'exécution d'une requête afin dd'otenir des durées significatives.
Pour mesurer principalement les transferts entre les sites et non la durée d'affichage du résultat, on modifie légèrement les requêtes : le résultat d'une requête est agrégé (par exemple avec un max). Comme cela, le résultat d'une requête sera “petit”, il aura un seul nuplet. Ainsi, le temps d'affichage devient négligeable face à la durée de transfert entre les sites.
Comparer les deux exécution suivantes :
SET timing ON DECLARE res NUMBER; BEGIN FOR i IN 1 .. 10 LOOP SELECT MAX(LENGTH(s.profil)) INTO res FROM Stagiaire s, Club c WHERE s.cnum = c.cnum AND c.ville = 'ville7'; END LOOP; END; / SET timing off
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 = 'ville7'; END LOOP; END; / SET timing off
SELECT * FROM Club c WHERE c.division=1
Aller vers BDR