site:enseignement:master:bdr:tmejointure
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:tmejointure [08/03/2018 10:51] – [Exercice 1 : Jointure entre 2 relations] hubert | site:enseignement:master:bdr:tmejointure [14/03/2019 09:51] (Version actuelle) – [Divers] hubert | ||
---|---|---|---|
Ligne 3: | Ligne 3: | ||
====== TME Jointure ====== | ====== TME Jointure ====== | ||
- | ==version | + | /* |
+ | |||
+ | TME pour BDR | ||
+ | |||
+ | Voir l' | ||
+ | |||
+ | |||
+ | */ | ||
+ | |||
+ | ==version | ||
Ligne 17: | Ligne 26: | ||
** Ne pas oublier de consulter les <fc # | ** Ne pas oublier de consulter les <fc # | ||
+ | |||
<showif isloggedin> | <showif isloggedin> | ||
- | + | **<fc # | |
</ | </ | ||
+ | |||
===== Préparation du TME ===== | ===== Préparation du TME ===== | ||
Lire l' | Lire l' | ||
Ligne 29: | Ligne 40: | ||
| emacs tmeJointure.sql & | éditer le fichier à compléter pendant le TME| | | emacs tmeJointure.sql & | éditer le fichier à compléter pendant le TME| | ||
| **Alt-x** my/ | | **Alt-x** my/ | ||
- | | aller sur le paragraphe contenant @base3 et faire Ctrl-C Ctrl-C | créer vos tables J, C, F, les index et les statistiques nécessaires à l' | + | | aller sur le paragraphe contenant @baseJCF |
Les tables d'un club de sport sont : | Les tables d'un club de sport sont : | ||
Ligne 53: | Ligne 64: | ||
puis terminer chaque requête par | puis terminer chaque requête par | ||
@p4 | @p4 | ||
+ | |||
+ | |||
+ | <showif isloggedin> | ||
+ | < | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
===== Exercice préliminaire | ===== Exercice préliminaire | ||
Combien de n-uplets ont chacune des relations J, C, F et BigJoueur? | Combien de n-uplets ont chacune des relations J, C, F et BigJoueur? | ||
+ | Quel est le coût d' | ||
+ | |||
<code sql> | <code sql> | ||
explain plan for | explain plan for | ||
Ligne 62: | Ligne 83: | ||
</ | </ | ||
- | Quel est le coût d' | ||
Combien de pages ont chacune des relations ? | Combien de pages ont chacune des relations ? | ||
Ligne 102: | Ligne 122: | ||
a) Traduisez la requête en français. | a) Traduisez la requête en français. | ||
+ | |||
+ | <showif isloggedin> | ||
+ | <fc # | ||
+ | </ | ||
b) Affichez le plan **P1** de cette requête. Quel est le nom de l' | b) Affichez le plan **P1** de cette requête. Quel est le nom de l' | ||
+ | |||
+ | |||
+ | <showif isloggedin> | ||
+ | |||
+ | < | ||
+ | REPONSE: | ||
+ | ---------------------------------------------------------------- | ||
+ | | Id | Operation | ||
+ | ---------------------------------------------------------------- | ||
+ | | 0 | SELECT STATEMENT | ||
+ | |* 1 | HASH JOIN | ||
+ | | 2 | TABLE ACCESS FULL| C | 5000 | 60000 | 7 (0)| | ||
+ | |* 3 | TABLE ACCESS FULL| J | 50000 | | ||
+ | ---------------------------------------------------------------- | ||
+ | </ | ||
+ | |||
+ | <fc # | ||
+ | |||
+ | <code ascii> | ||
+ | REPONSE: | ||
+ | 0 | ||
+ | | | ||
+ | 1 | ||
+ | / \ | ||
+ | 2 | ||
+ | 2=Club et proj sur cnum, | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
c) Quelle table est lue en premier, J ou C, pourquoi ? | c) Quelle table est lue en premier, J ou C, pourquoi ? | ||
+ | |||
+ | <showif isloggedin> | ||
+ | <fc # | ||
+ | </ | ||
+ | |||
d) Quel est le coût de P1 ? Expliquer comment le coût est calculé en fonction des coûts d' | d) Quel est le coût de P1 ? Expliquer comment le coût est calculé en fonction des coûts d' | ||
+ | |||
+ | <showif isloggedin> | ||
+ | <fc # | ||
+ | </fc> | ||
+ | </ | ||
=== Question 2) === | === Question 2) === | ||
On considère la requête **R2**. | On considère la requête **R2**. | ||
+ | |||
+ | <showif isloggedin> | ||
+ | < | ||
+ | </ | ||
<code sql> | <code sql> | ||
Ligne 123: | Ligne 191: | ||
a) Afficher et dessiner le plan **P2** de cette requête. | a) Afficher et dessiner le plan **P2** de cette requête. | ||
+ | |||
+ | <showif isloggedin> | ||
+ | |||
+ | < | ||
+ | | Id | Operation | ||
+ | ---------------------------------------------------------------- | ||
+ | | 0 | SELECT STATEMENT | ||
+ | |* 1 | HASH JOIN | ||
+ | |* 2 | TABLE ACCESS FULL| J | 1000 | 14000 | 68 (0)| | ||
+ | | 3 | TABLE ACCESS FULL| C | 5000 | 60000 | 7 (0)| | ||
+ | ---------------------------------------------------------------- | ||
+ | |||
+ | Predicate Information | ||
+ | ---------------------- | ||
+ | 1 - access(J.CNUM=C.CNUM) | ||
+ | 2 - filter(SALAIRE< | ||
+ | </ | ||
+ | |||
+ | |||
+ | <fc #008000> | ||
+ | Réponse: | ||
+ | |||
+ | 2=joueurs et selection et proj | ||
+ | |||
+ | 3=club et proj | ||
+ | </fc> | ||
+ | </ | ||
+ | |||
+ | |||
b) Quelle table est lue en premier J ou C, pourquoi ? | b) Quelle table est lue en premier J ou C, pourquoi ? | ||
+ | |||
+ | <showif isloggedin> | ||
+ | <fc #008000> | ||
+ | la table Joueur car on ne sélectionne que 1000 Joueurs (sur 50 000 Joueurs) pour la jointure. La taille des 1000 Joueurs (14Ko) est plus petite celle des Clubs (60Ko). | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
c) Quel est le coût de **P2** ? | c) Quel est le coût de **P2** ? | ||
+ | |||
+ | <showif isloggedin> | ||
+ | <fc #008000> | ||
+ | le coût de P2 est le même que P1 bien qu'on inverse l' | ||
+ | cout(C) + cout(J) = cout(J) + cout(C) | ||
+ | </fc> | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
/* question d) spécifique a l'UE BDR */ | /* question d) spécifique a l'UE BDR */ | ||
Ligne 164: | Ligne 280: | ||
a) Affichez le plan **P3** de cette requête. Quel est le nom de l' | a) Affichez le plan **P3** de cette requête. Quel est le nom de l' | ||
+ | |||
+ | |||
+ | <showif isloggedin> | ||
+ | |||
+ | < | ||
+ | | Id | Operation | ||
+ | ------------------------------------------------------------------------------ | ||
+ | | 0 | SELECT STATEMENT | ||
+ | | 1 | NESTED LOOPS | ||
+ | | 2 | | ||
+ | |* 3 | TABLE ACCESS FULL | C | 2 | 30 | | ||
+ | |* 4 | INDEX RANGE SCAN | I_J_CNUM | 10 | | | ||
+ | | 5 | TABLE ACCESS BY INDEX ROWID| J | 10 | 90 | 11 (0)| | ||
+ | ------------------------------------------------------------------------------ | ||
+ | |||
+ | Predicate Information : | ||
+ | 3 - filter(C.NOM=' | ||
+ | 4 - access(J.CNUM=C.CNUM) | ||
+ | </ | ||
+ | |||
+ | |||
+ | <fc #008000> | ||
+ | **Reponse: NESTED LOOP | ||
+ | **</ | ||
+ | </ | ||
+ | |||
b) Détailler les étapes de l' | b) Détailler les étapes de l' | ||
+ | |||
+ | <showif isloggedin> | ||
+ | **<fc # | ||
+ | * Lire la table Club et sélectionner les 2 clubs. Proj sur division et cnum | ||
+ | * Itération pour chaque club c (parmi les 2 clubs): | ||
+ | * accéder à l' | ||
+ | * Pour chaque rowid | ||
+ | * lire le nuplet de joueur correspondant et proj sur licence | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | |||
c) Quel est le coût du plan exprimé en fonction du coût pour lire une table, un index et pour lire un nuplet seul. | c) Quel est le coût du plan exprimé en fonction du coût pour lire une table, un index et pour lire un nuplet seul. | ||
+ | |||
+ | |||
+ | <showif isloggedin> | ||
+ | **<fc # | ||
+ | * lire la table C: cout(lire C)=7 et sélectionner 2 clubs | ||
+ | * pour chaque club sélectionné: | ||
+ | * lire l' | ||
+ | * pour chaque rowid | ||
+ | * lire un joueur: cout(lire nuplet) =1 | ||
+ | |||
+ | cout(P3) = cout(C) + 2 * ( cout(index) + 10 * cout(lire nuplet) ) | ||
+ | = | ||
+ | = 29 | ||
+ | </ | ||
+ | |||
Ligne 189: | Ligne 359: | ||
Affichez le plan **P4** de cette requête, expliquer ses étapes et son coût. | Affichez le plan **P4** de cette requête, expliquer ses étapes et son coût. | ||
+ | |||
+ | |||
+ | <showif isloggedin> | ||
+ | < | ||
+ | | Id | Operation | ||
+ | ---------------------------------------------------------------------------------- | ||
+ | | 0 | SELECT STATEMENT | ||
+ | | 1 | NESTED LOOPS | ||
+ | | 2 | | ||
+ | | 3 | TABLE ACCESS BY INDEX ROWID| J | 3 | 42 | 5 (0)| | ||
+ | |* 4 | INDEX RANGE SCAN | I_J_SALAIRE | 3 | | 2 (0)| | ||
+ | |* 5 | INDEX UNIQUE SCAN | I_C_CNUM | ||
+ | | 6 | TABLE ACCESS BY INDEX ROWID | C | 1 | 7 | 1 (0)| | ||
+ | ---------------------------------------------------------------------------------- | ||
+ | |||
+ | Predicate Information | ||
+ | --------------------- | ||
+ | 4 - access(J.SALAIRE> | ||
+ | 5 - access(J.CNUM=C.CNUM) | ||
+ | </ | ||
+ | | ||
+ | <fc #008000> REPONSE:</ | ||
+ | |||
+ | * Accès à l' | ||
+ | * Pour chaque rowid, | ||
+ | * Lire le nuplet correspondant de la table Joueur et projeter sur //cnum// et //licence// | ||
+ | * Le cnum permet d' | ||
+ | * Le rowid permet de lire le nuplet correpondant de la table Club et projeter sur l' | ||
+ | </ | ||
Ligne 195: | Ligne 394: | ||
===== Exercice 2: Directives USE_NL et USE_HASH pour une jointure ===== | ===== Exercice 2: Directives USE_NL et USE_HASH pour une jointure ===== | ||
+ | |||
Objectif : comprendre la notion de choix entre 2 plans equivalents, | Objectif : comprendre la notion de choix entre 2 plans equivalents, | ||
Ligne 231: | Ligne 431: | ||
Expliquer le plan. Vérifier que son coût est supérieur à celui de P2. | Expliquer le plan. Vérifier que son coût est supérieur à celui de P2. | ||
+ | |||
+ | <showif isloggedin> | ||
+ | <fc # | ||
+ | < | ||
+ | | Id | Operation | ||
+ | ------------------------------------------------------------------------------ | ||
+ | | 0 | SELECT STATEMENT | ||
+ | | 1 | NESTED LOOPS | ||
+ | | 2 | | ||
+ | |* 3 | TABLE ACCESS FULL | J | 50000 | | ||
+ | |* 4 | INDEX UNIQUE SCAN | I_C_CNUM | 1 | | | ||
+ | | 5 | TABLE ACCESS BY INDEX ROWID| C | 1 | 12 | | ||
+ | ------------------------------------------------------------------------------ | ||
+ | Predicate Information | ||
+ | ----------------------- | ||
+ | 3 - filter(" | ||
+ | 4 - access(" | ||
+ | </ | ||
+ | </ | ||
Ligne 247: | Ligne 466: | ||
Expliquer le plan. Vérifier que son coût est supérieur à celui de P3 (de l' | Expliquer le plan. Vérifier que son coût est supérieur à celui de P3 (de l' | ||
+ | |||
+ | |||
+ | <showif isloggedin> | ||
+ | <fc # | ||
+ | < | ||
+ | | Id | Operation | ||
+ | ---------------------------------------------------------------- | ||
+ | | 0 | SELECT STATEMENT | ||
+ | |* 1 | HASH JOIN | ||
+ | |* 2 | TABLE ACCESS FULL| C | 2 | 30 | 7 (0)| | ||
+ | | 3 | TABLE ACCESS FULL| J | 50000 | | ||
+ | ---------------------------------------------------------------- | ||
+ | Predicate Information | ||
+ | ---------------------- | ||
+ | 1 - access(" | ||
+ | 2 - filter(" | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
Ligne 263: | Ligne 503: | ||
Expliquer le plan. Vérifier que son coût est supérieur à celui de P4. | Expliquer le plan. Vérifier que son coût est supérieur à celui de P4. | ||
+ | |||
+ | |||
+ | <showif isloggedin> | ||
+ | <fc # | ||
+ | < | ||
+ | | Id | Operation | ||
+ | --------------------------------------------------------------------------------- | ||
+ | | 0 | SELECT STATEMENT | ||
+ | |* 1 | HASH JOIN | ||
+ | | 2 | TABLE ACCESS BY INDEX ROWID| J | 3 | 42 | 5 (0)| | ||
+ | |* 3 | INDEX RANGE SCAN | I_J_SALAIRE | 3 | | 2 (0)| | ||
+ | | 4 | TABLE ACCESS FULL | C | ||
+ | --------------------------------------------------------------------------------- | ||
+ | Predicate Information | ||
+ | --------------------- | ||
+ | 1 - access(" | ||
+ | 3 - access(" | ||
+ | </ | ||
+ | </ | ||
+ | |||
Ligne 307: | Ligne 567: | ||
| J, C, F | | | | J, C, F | | | ||
| J, F, C | | | | J, F, C | | | ||
+ | |||
+ | |||
+ | |||
+ | <showif isloggedin> | ||
+ | <fc # | ||
+ | |||
+ | |||
+ | <fc # | ||
+ | |||
+ | < | ||
+ | ----------------------------------------------------------------- | ||
+ | | Id | Operation | ||
+ | ----------------------------------------------------------------- | ||
+ | | 0 | SELECT STATEMENT | ||
+ | |* 1 | HASH JOIN | | 1 | 40 | 82 (3)| | ||
+ | |* 2 | TABLE ACCESS FULL | J | 5 | 90 | 68 (0)| | ||
+ | |* 3 | HASH JOIN | | ||
+ | |* 4 | TABLE ACCESS FULL| C | 2500 | 37500 | 7 (0)| | ||
+ | | 5 | TABLE ACCESS FULL| F | 5000 | 35000 | 5 (0)| | ||
+ | ----------------------------------------------------------------- | ||
+ | </ | ||
+ | |||
+ | <fc # | ||
+ | < | ||
+ | ------------------------------------------------------------------------------ | ||
+ | | Id | Operation | ||
+ | ------------------------------------------------------------------------------ | ||
+ | | 0 | SELECT STATEMENT | ||
+ | | 1 | NESTED LOOPS | ||
+ | | 2 | | ||
+ | |* 3 | HASH JOIN | ||
+ | |* 4 | TABLE ACCESS FULL | C | 2500 | 37500 | | ||
+ | |* 5 | TABLE ACCESS FULL | J | 5 | 90 | 68 (0)| | ||
+ | |* 6 | INDEX UNIQUE SCAN | I_F_CNUM | 1 | | | ||
+ | | 7 | TABLE ACCESS BY INDEX ROWID| F | 1 | 7 | | ||
+ | ------------------------------------------------------------------------------ | ||
+ | </ | ||
+ | |||
+ | <fc # | ||
+ | < | ||
+ | ----------------------------------------------------------------- | ||
+ | | Id | Operation | ||
+ | ----------------------------------------------------------------- | ||
+ | | 0 | SELECT STATEMENT | ||
+ | |* 1 | HASH JOIN | | 1 | 40 | 82 (3)| | ||
+ | |* 2 | TABLE ACCESS FULL | J | 5 | 90 | 68 (0)| | ||
+ | |* 3 | HASH JOIN | | ||
+ | | 4 | TABLE ACCESS FULL| F | 5000 | 35000 | 5 (0)| | ||
+ | |* 5 | TABLE ACCESS FULL| C | 2500 | 37500 | 7 (0)| | ||
+ | ----------------------------------------------------------------- | ||
+ | </ | ||
+ | |||
+ | <fc # | ||
+ | < | ||
+ | ------------------------------------------------------------------------------ | ||
+ | | Id | Operation | ||
+ | ------------------------------------------------------------------------------ | ||
+ | | 0 | SELECT STATEMENT | ||
+ | | 1 | NESTED LOOPS | ||
+ | | 2 | | ||
+ | |* 3 | HASH JOIN | ||
+ | | 4 | TABLE ACCESS FULL | F | 5000 | 35000 | | ||
+ | |* 5 | TABLE ACCESS FULL | J | 5 | 90 | 68 (0)| | ||
+ | |* 6 | INDEX UNIQUE SCAN | I_C_CNUM | 1 | | | ||
+ | |* 7 | TABLE ACCESS BY INDEX ROWID| C | 1 | 15 | | ||
+ | ------------------------------------------------------------------------------ | ||
+ | </ | ||
+ | |||
+ | <fc # | ||
+ | < | ||
+ | -------------------------------------------------------------------------------- | ||
+ | | Id | Operation | ||
+ | -------------------------------------------------------------------------------- | ||
+ | | 0 | SELECT STATEMENT | ||
+ | | 1 | NESTED LOOPS | ||
+ | | 2 | | ||
+ | | 3 | NESTED LOOPS | ||
+ | |* 4 | TABLE ACCESS FULL | J | 5 | 90 | 68 (0)| | ||
+ | |* 5 | TABLE ACCESS BY INDEX ROWID| C | 1 | 15 | 1 (0)| | ||
+ | |* 6 | INDEX UNIQUE SCAN | I_C_CNUM | 1 | | 0 (0)| | ||
+ | |* 7 | INDEX UNIQUE SCAN | I_F_CNUM | 1 | | 0 (0)| | ||
+ | | 8 | TABLE ACCESS BY INDEX ROWID | F | 1 | 7 | 1 (0)| | ||
+ | -------------------------------------------------------------------------------- | ||
+ | </ | ||
+ | <fc # | ||
+ | < | ||
+ | -------------------------------------------------------------------------------- | ||
+ | | Id | Operation | ||
+ | -------------------------------------------------------------------------------- | ||
+ | | 0 | SELECT STATEMENT | ||
+ | | 1 | NESTED LOOPS | ||
+ | | 2 | | ||
+ | | 3 | NESTED LOOPS | ||
+ | |* 4 | TABLE ACCESS FULL | J | 5 | 90 | 68 (0)| | ||
+ | | 5 | TABLE ACCESS BY INDEX ROWID| F | 1 | 7 | 1 (0)| | ||
+ | |* 6 | INDEX UNIQUE SCAN | I_F_CNUM | 1 | | 0 (0)| | ||
+ | |* 7 | INDEX UNIQUE SCAN | I_C_CNUM | 1 | | 0 (0)| | ||
+ | |* 8 | TABLE ACCESS BY INDEX ROWID | C | 1 | 15 | 1 (0)| | ||
+ | -------------------------------------------------------------------------------- | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
Ligne 323: | Ligne 695: | ||
Dessiner le plan obtenu. Expliquer son coût. | Dessiner le plan obtenu. Expliquer son coût. | ||
+ | |||
+ | |||
+ | <showif isloggedin> | ||
+ | <fc # | ||
+ | < | ||
+ | ----------------------------------------------------------------------------------- | ||
+ | | Id | Operation | ||
+ | ----------------------------------------------------------------------------------- | ||
+ | | 0 | SELECT STATEMENT | ||
+ | | 1 | NESTED LOOPS | ||
+ | | 2 | | ||
+ | | 3 | NESTED LOOPS | ||
+ | |* 4 | TABLE ACCESS BY INDEX ROWID| J | ||
+ | |* 5 | INDEX RANGE SCAN | I_J_SALAIRE | 997 | | ||
+ | | 6 | TABLE ACCESS BY INDEX ROWID| F | ||
+ | |* 7 | INDEX UNIQUE SCAN | I_F_CNUM | ||
+ | |* 8 | INDEX UNIQUE SCAN | I_C_CNUM | ||
+ | |* 9 | TABLE ACCESS BY INDEX ROWID | C | ||
+ | ----------------------------------------------------------------------------------- | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | |||
Ligne 339: | Ligne 736: | ||
Dessiner le plan obtenu. Expliquer son coût. | Dessiner le plan obtenu. Expliquer son coût. | ||
+ | <showif isloggedin> | ||
+ | <fc # | ||
+ | < | ||
+ | ------------------------------------------------------------------------------------ | ||
+ | | Id | Operation | ||
+ | ------------------------------------------------------------------------------------ | ||
+ | | 0 | SELECT STATEMENT | ||
+ | | 1 | NESTED LOOPS | ||
+ | | 2 | | ||
+ | |* 3 | HASH JOIN | ||
+ | |* 4 | TABLE ACCESS FULL | J | 5 | 90 | 68 (0)| | ||
+ | | 5 | TABLE ACCESS BY INDEX ROWID| C | 2500 | 37500 | 23 (0)| | ||
+ | |* 6 | INDEX RANGE SCAN | I_C_DIVISION | 2500 | | ||
+ | |* 7 | INDEX UNIQUE SCAN | I_F_CNUM | ||
+ | | 8 | TABLE ACCESS BY INDEX ROWID | F | 1 | 7 | | ||
+ | ------------------------------------------------------------------------------------ | ||
+ | </ | ||
+ | </ | ||
Ligne 378: | Ligne 793: | ||
Documentation sur [[http:// | Documentation sur [[http:// | ||
+ | |||
+ | [[http:// | ||
Aller vers [[site: | Aller vers [[site: | ||
site/enseignement/master/bdr/tmejointure.1520502665.txt.gz · Dernière modification : de hubert