Précédent Index Suivant

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.


Précédent Index Suivant