Fonctionnement d un SGBD TD 7 (2 séances) L optimisation I. Révisions sur le l algèbre relationnelle EXERCICE 1 : relationnel suivant: (inspiré par Richard Grin et Isabelle Mirbel) Soit le schéma Employé(Matricule, Nom, Poste, DateEmbauche, MatriculeSupérieur, Salaire, Commission, NuméroDépartement) Département(Numéro, Nom, Lieu) Projet(Code, Nom) Participation(Matricule, CodeProjet, Fonction) Donnez la suite d opérations élémentaires de l algèbre relationnelle pour obtenir les données qui correspondent aux listes suivantes: 1. Matricule et nom des employés qui ont été embauchés avant le 1 janvier 1995. 2. Nom des employés qui ont le poste de secrétaire. 3. Nom des employés avec le nom du département où ils travaillent. 4. Nom des employés qui travaillent dans le département Finances. 5. Numéro des départements qui ont au moins un ingénieur. 6. Nom des employés qui gagnent plus que leur supérieur direct. 7. Matricule des employés qui participent à tous les projets. 8. Nom des employés qui participent à tous les projets. 9. Numéro des départements qui participent à tous les projets. 10. Nom des départements qui ont tous les postes. 11. Nom des employés qui ne participent à aucun projet. 12. Nom des départements qui ont à la fois au moins un ingénieur et au moins un secrétaire. Pierre Crescenzo inspiré par Isabelle Mirbel page 1 sur 6
II. Compléments du cours EXERCICE 1 : Soit un arbre algébrique et des informations statistiques sur les tables qu il manipule. Indiquez les exécutions possibles et évaluez leur coût d exécution. III. Application du cours EXERCICE 1 : Soit le schéma relationnel suivant: Etudiant(Id-Etud, Nom-Etud, Adr-Etud, Res) UFR(Id-UFR, Nom-UFR, Adr-UFR) Cours(Id-Cours, No-UFR, Libellé, Resp) Inscr(No-Cours, No-Etud, Note) Analysez l arbre de la figure suivante et essayez de l améliorer. Optimisez les requêtes suivantes en utilisant l optimisation d expression algébrique. Q1= π[nom-ufr, Adr-UFR]σ[Id-UFR = No-UFR](σ[Resp= Dupont ]Cours UFR) Pierre Crescenzo inspiré par Isabelle Mirbel page 2 sur 6
Q2 = select Nom-UFR, Libellé, Id-Cours from UFR, Cours, Inscr, Etudiant where (Nom-Etud = Smith ) and Cours.Id-Cours = Inscr.No-Cours) and (UFR.Id- UFR = Cours.No-UFR) and (Etudiant.Id-Etud = Inscr.No-Etud) Q3 = select Nom-Etud, Note, Id-Cours from Etudiant, Inscr, Cours, UFR where (Nom-UFR = Sciences ) and (Libellé= Philosophie ) and (Cours.Id- Cours = Inscr.No-Cours) and (UFR.Id-UFR = Cours.No-UFR) and (Etudiant.Id- Etud = Inscr.No-Etud) Considérons une base de données constituée des relations sui- EXERCICE 2: vantes: Production(NoPdt, Type, Modele, Qté, Machine) DetailCmde(NoCmde, NoPdt) Cmde(NoCmde, Client, Montant) Comm(NoCmde, Vendeur, Montant) et considérons les profils suivants: CARD(Production) = 200 000 SIZE(Production) = 41 CARD(DetailCmde) = 50 000 SIZE(DetailCmde) = 15 CARD(Cmde) = 10 000 SIZE(Cmde) = 45 CARD(Comm) = 5 000 SIZE(Comm) = 35 SIZE(NoPdt) = 10 VAL(NoPdt) = 200 000 SIZE(Type) = 1 VAL(Type) = 4 SIZE(Modele) = 10 VAL(Modele) = 400 SIZE(Qté) = 10 VAL(Qté) = 100 SIZE(Machine) = 10 VAL(Machine) = 50 SIZE(NoCmde) = 5 VAL(NoCmde) = 10 000 SIZE(Client) = 30 VAL(Client) = 400 SIZE(Montant) = 10 VAL(Montant) = 5000 SIZE(Vendeur) = 20 VAL(Vendeur) = 25 Décrivez l optimisation algébrique et le calcul des profils sur les résultats intermédiaires pour les requêtes suivantes. Pour cela écrivez les en SQL puis traduisez les en langage algébrique. Pour les deux dernières, qui nécessitent des jointures entre trois tables, donnez l ordre qui vous semble le plus indiqué. Donnez la quantité disponible du produit R2778. Donnez les machines nécessaires à la production des produits achetés par M. Dupont. Trouvez les clients qui ont acheté au vendeur Smith un produit du modèle M24. Pierre Crescenzo inspiré par Isabelle Mirbel page 3 sur 6
IV. Mise en pratique sous Oracle ORACLE EXPLAIN PLAN L outil EXPLAIN PLAN d ORACLE permet de soumettre une expression SQL et d obtenir un plan d exécution sans que la requête ne soit lancée. Voici les étapes à suivre avant d utiliser la commande EXPLAIN PLAN. Créez une table PLAN TABLE destinée à contenir toutes les informations relatives à un plan d exécution. CREATE TABLE PLAN_TABLE( STATEMENT_ID VARCHAR2(30), /* ID défini dans la commande SQL */ TIMESTAMP DATE, /* Date d exécution de la commande EXPLAIN */ REMARKS VARCHAR2(80), OPERATION VARCHAR2(30), /* Nom de l opération interne effectuée */ OPTIONS VARCHAR2(30), OBJECT_NODE VARCHAR2(30), OBJECT_OWNER VARCHAR2(30), OBJECT_NAME VARCHAR2(30), /* Nom de la table ou de l index */ OBJECT_INSTANCE NUMBER(38), OBJECT_TYPE VARCHAR2(30), SEARCH_COLUMNS NUMBER(38), ID NUMBER(38), /* Numéro affecté à chaque étape dans le plan */ PARENT_ID NUMBER(38), /* Numéro de l étape suivante */ POSITION NUMBER(38), /* Ordre de traitement des étapes qui ont le OTHER LONG); m^eme PARENT_ID */ Exécutez une requête d essai en demandant le stockage des explications relatives à cette requêtes dans la table précédemment créée. Exemple: EXPLAIN_PLAN SET STATEMENT_ID = R1 FOR SELECT * FROM matable WHERE id = 12; Interrogez cette table pour connaître le plan d exécution. Pierre Crescenzo inspiré par Isabelle Mirbel page 4 sur 6
EXERCICE 1: Créez les tables suivantes (tous les attributs sont des chaînes de caractères de longueur identique): Film(Titre, réalisateur, année) Vu(Spectateur, titre) Insérez-y quelques tuples. Utilisez la commande EXPLAIN PLAN pour regarder le plan d exécution correspondant à la requête: Donner les réalisateurs et les années des films qui ont été vus par au moins un spectateur. Ajoutez un index sur le titre dans la table film. Regardez à nouveau le plan d exécution d Oracle. Que constatez vous? Ajoutez un index sur titre dans la relation Vu. Il y a donc maintenant deux index. Regardez à nouveau le plan d exécution d Oracle. Que constatez vous? EXERCICE 2: Soit une requête sur la table Employé qui affiche le nom des employés (et leur département d appartenance) ayant un salaire (sans commission) supérieur à 10000. Analyser le plan d exécution dans chacune des situations suivantes: présence d un index sur Employé(Salaire) présence d un index sur Département(Numéro) et sur Employé(Salaire) présence d un index sur Employé(Numéro) et sur Employé(Salaire) Intéressons-nous maintenant à la requête qui donne le nom de tous les employés qui travaillent dans le département situé à Paris. On considère qu il n y a plus aucun index sur les relations de la bases de données. Écrivez la requête, sans utiliser de sous-requête, et analyse le plan d exécution. Écrivez la requête, en utilisant une sous-requête, et analyse le plan d exécution. Que constatez-vous? Le paramètre OPTIMIZER MODE configure l instance ORACLE. Sa valeur par défaut est CHOOSE, nécessaire pour une optimisation basée sur les coûts. L optimiseur effectue ce type d optimisation s il dispose de statistiques sur au moins une table de la requête. L outil ANALYZE permet de calculer des statistiques sur les tables et les index. On trouve alors les informations statistiques sur les tables dans la table USER TABLES et celles sur les index dans DBA INDEX, ALL INDEX et USER INDEXES. Exemples d utilisation: ANALYZE TABLE matable COMPUTE STATISTICS FOR TABLE; ANALYZE INDEX myindex COMPUTE STATISTICS; ANALYZE TABLE matable COMPUTE STATISTICS FOR ALL INDEXES; Pierre Crescenzo inspiré par Isabelle Mirbel page 5 sur 6
EXERCICE 3 : Examinez la structure de la table USER TABLES et faites afficher le nombre de lignes et le nombre de blocs des tables du schéma relationnel sur les employés. Lancez le calcul des statistiques sur les tables de ce même schéma relationnel. Affichez à nouveau le nombre de lignes et le nombre de blocs des tables du schéma relationnel sur les employés. Analysez la structure de la table USER INDEXES et faites afficher le nombre de niveaux, de blocs feuilles, de valeurs distinctes des index définis sur les clés primaires. Pierre Crescenzo inspiré par Isabelle Mirbel page 6 sur 6