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.
On dispose de 2 SGBD : site 1 et site 2
CONNECT E1234567/E1234567@ora11 -- remplacer 1234567 par votre numéro d'étudiant -- vérifier la connexion en affichant le nom du SGBD : SELECT sys_context('USERENV', 'SESSION_USER') FROM dual; -- doit afficher oracle
CONNECT E1234567/E1234567@ora10 -- remplacer 1234567 par votre numéro d'étudiant SELECT sys_context('USERENV', 'SESSION_USER') FROM dual; -- doit afficher ora10
Données:
La couche BDR est implémentée sur le site 1 ora11
Créer les tables J,C,F (déjà fait lors du TME précédent)
CONNECT ... @ora11 @base3
Supprimer les joueurs J du site 1 (les joueurs seront stockés seulement sur le site 2)
CONNECT ... @ora11 DROP TABLE J; DESC J -- doit répondre: "table inconnue"
Créer la table J des joueurs dans le site 2 (ora10)
CONNECT ... @ora10 @base3 DROP TABLE C cascade constraints; DROP TABLE F;
Relier les sites : La couche BDR (site1) doit pouvoir se connecter au site 2
CONNECT ... @ora11 DROP DATABASE link site2; CREATE DATABASE link site2 CONNECT TO E1234567 IDENTIFIED BY "E1234567" USING 'ora10'; -- remplacer 1234567 par votre numéro d'étudiant
Vérifier le bon fonctionnement du lien
CONNECT ... @ora11 DESC J@site2
CONNECT ... @ora11 CREATE VIEW J AS SELECT * FROM j@site2;
Pour chaque requête, répondre aux questions
Afficher les joueurs avec leur club
CONNECT ... @ora11 EXPLAIN plan FOR SELECT * FROM J j1, C c1 WHERE j1.cnum = c1.cnum; @p5
EXPLAIN plan FOR SELECT * FROM J j1, C c1 WHERE j1.cnum = c1.cnum AND j1.salaire > 59000; @p5
La sélection est-elle poussée sur le site 2 ?
EXPLAIN plan FOR SELECT j1.licence, c1.division FROM J j1, C c1 WHERE j1.cnum = c1.cnum AND c1.ville = 'Paris'; @p5
La directive driving_site prend en argument le nom de la variable j1 associée à la relation stockée sur le site dans lequel oracle doit traiter la jointure (i.e. le site 2).
EXPLAIN plan FOR SELECT /*+ driving_site(j1) */ j1.licence, c1.division FROM J j1, C c1 WHERE j1.cnum = c1.cnum AND c1.ville = 'Paris'; @p5
Aller vers BDR