2 Optimisation (7 points)
On crée la table 'AchatJour' comme le résultat de la jointure
naturelle des tables Achat et DateAchat ci-dessus. Donner la requête SQL
correspondante (1 point).
Solution:
select NumProd,Achat.NumAchat,Jour,Quantité
from Achat, DateAchat
where Achat.NumAchat=DateAchat.NumAchat
Soit la requête
select NomProd
from Produit,AchatJour
where Produit.NumProd = AchatJour.NumProd
and Jour = 'Mardi'
Que calcule cette requête (0,5 point)?
Solution:
Le nom des produits achetés le mardi.
Donnez une expression de l'algèbre relationnelle équivalente à la
requête SQL ci-dessus optimisée (première phase de
l'optimisation). Vous pouvez utiliser une forme arborescente (1
point).
Solution:
On fait d'abord la sélection sur la table AchatJour, on projète sur le
Numéro de produit, on fait ensuite la jointure naturelle avec la table
Produit et on projète sur le nom du produit.
Le seul index qui existe est un index de la table AchatJour sur le
jour. Le plan d'exécution logique ci-dessus (expression de l'algèbre
optimisée) comporte une jointure. Quel algorithme de jointure
suggérez-vous pour cette jointure (0,5 point)?
Solution:
Les deux tables n'ont pas d'index sur l'attribut de jointure. On
choisit donc le tri-fusion.
Donner un plan d'exécution physique (soit sous forme arborescente, soit
en utilisant la syntaxe de l'outil EXPLAIN d'Oracle) (1 point). Expliquez en
détail ce plan (1 point)
Solution:
0 SELECT STATEMENT
1 MERGE JOIN
2 SORT JOIN
3 TABLE ACCESS FULL Produit
4 SORT JOIN
5 TABLE ACCESS BY INDEX ROWID AchatJour
6 INDEX RANGE SCAN AchatJour_Jour
On sélectionne les achats du mardi par l'index et on les projète sur
le numéro de produit. On trie l'ensemble de numéros de produit
obtenus. On balaye les produits (table Produit) et on les projète sur le numéro de
produit et le nom de produit. On trie l'ensemble obtenu sur le numéro
de produit. On fusionne alors les deux ensembles triés et on garde le
nom de produit.
On rajoute un index pour la table Produit sur le numéro de
produit. L'index est-il unique ? (0,5 point) Donner le nouveau plan
d'exécution et expliquer (1 point) et expliquez (0,5 point)
Solution:
L'index est unique.
0 SELECT STATEMENT
1 NESTED LOOPS
2 TABLE ACCESS BY INDEX ROWID AchatJour
3 INDEX RANGE SCAN AchatJour_Jour
4 TABLE ACCESS BY INDEX ROWID Produit
5 INDEX RANGE SCAN Produit_NumProd
On accede aux achats du mardi par l'index sur la table AchatJour, pour
chacun d'eux, le numéro de produit sert de clé d'accès à l'index sur
la table Produit. On accède au produit correspondant.