TME Jointure Répartie
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.
- 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'ordre et l'emplacement des opérations permettant d'évaluer une requête répartie (quel site traite quelles opérations?).
Scénario
On dispose de 2 SGBD : site 1 et site 2
Données: Le site 1 contient les Clubs (table C), le site 2 contient les Joueurs (table J)
La couche BDR est implémentée sur le site 1.
Installation
créer les tables J,C,F (déjà fait lors du TME précédent)
@base3
supprimer les Joueurs du site 1 (les joueurs sont maintenant sur le site 2)
drop table J;
Relier les sites :
- La couche BDR (site1) doit pouvoir se connecter au site 2 create database link ora2 connect to bdwa2 identified by "bdwa2" using 'ora2';
Vérifier le bon fonctionnement du lien
desc J@ora2
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.
insert into C values( 6000, 2, 'petit club', 'Combourg');
Construire le schéma global
create view J as select * from j@ora2;
Requêtes réparties
Pour chaque requête, répondre aux questions
- Où est traitée chaque opération (sélection, projection, jointure, ...) ?
- Quelles sont les données transférées entre les sites pendant l'évaluation de la requête ?
- 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 joueurs avec leur club
select * from J, C where j.cnum = c.cnum;
R2 : jointure avec sélection
select * from J, C where j.cnum = c.cnum and salaire > 59000
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
select * from J, C where j.cnum = c.cnum and ville = 'Combourg';
R3b : jointure très sélective et avec un transfert faible
select /*+ driving_site(j1) */ * from J j1, c c1 where j1.cnum = c1.cnum and ville = 'Combourg';
- Proposer d'autres requête pour illustrer les optimisations de requêtes réparties vues en cours.