Exam Maitrise CMO partie BDO O2 janvier 2002
Transcription
Exam Maitrise CMO partie BDO O2 janvier 2002
Nom : page 1 Prénom : Université Pierre et Marie Curie - Paris 6 - UFR 922 - Maîtrise d'informatique Module Bases de Données et Web Partiel du 8 novembre 2006 Version CORRIGEE + RECTFICATIF Les documents ne sont pas autorisés – Durée : 2h. Répondre aux questions sur la feuille du sujet dans les cadres appropriés. La taille des cadres suggère celle de la réponse attendue. Utiliser le dos de la feuille précédente si la réponse déborde du cadre. Le barème est donné à titre indicatif. La qualité de la rédaction sera prise en compte. Ecrire à l’encre bleue ou noire. Ne pas dégrafer le sujet. Exercice 1 : Questions de cours 2 pts Question 1. Décrivez brièvement les différentes étapes de l’optimisation des requêtes. 1. ………..… 2………….… 3……………. 4……………. … … … Réponse : Normalisation, analyse syntaxique de la requête, simplification : vérifier la syntaxe de la requête et simplifier ce qui peut l’être. Mise sous forme d’arbre algébrique et restructuration : permet d’élaborer différents plans d’exécution Estimation du coût des différents plans : utilise une fonction de coût qui calcule le nb d’accès disque nécessaires pour effectuer la requête (taille des résultats intermédiaires, coût des opérations) Choix du meilleur plan : définition de l’espace de recherche et utilisation d’algorithmes de recherche Question 2. a) Décrire au moins deux inconvénients du hachage statique par rapport au hachage dynamique. Inconvénient 1: Lettres initiales du Prénom et du Nom: page 2 Inconvénient 2: Réponse: Inconvénient 1: La taille du fichier est prédéfinie au départ => l'augmentation de sa taille en cas de besoin entraîne un changement de la fonction de hachage et un rehachage de tout le fichier. Inconvénient 2: Possibilité de débordement des paquets => nécessite une stratégie pour la gestion des débordements (i.e., chaînage, rehachage, etc.) qui est toujours coûteuse et qui dégrade fortement les performances. b) Décrire un avantage et un inconvénient du hachage dynamique par rapport aux arbres B+. Avantage: Inconvénient: Réponse: Avantage: Le hachage dynamique est généralement beaucoup plus efficace en termes de coût de recherche. Inconvénient: Impossibilité de faire des recherches séquentielles de manière efficace du fait de la destruction de l'ordre des clés. Exercice 2 : Méthodes de placement et d'accès 4 pts Question 1. On considère l'arbre B+ suivant d'ordre 1, i.e., les nœuds peuvent contenir au plus 2 clés et au moins 1 clé. Montrer l'arbre B+ résultant de : a) l'insertion de la clé 31; b) l'insertion de la clé 27; c) la suppression de la clé 29; d) l'insertion de la clé 26; e) l'insertion de la clé 17 ; f) la suppression de la clé 13; Pour simplifier, on ne considère pas la redistribution de clés. Lettres initiales du Prénom et du Nom: 25 13 15 29 25 29 33 page 3 page 4 Lettres initiales du Prénom et du Nom: Réponse: a) b) 29 31 25 13 15 c) 25 25 13 15 29 25 31 33 13 15 d) 31 25 27 15 31 25 15 17 25 31 33 26 27 26 f) 31 25 26 27 25 31 33 31 33 29 26 26 e) 31 25 27 25 31 33 13 15 13 29 15 17 31 25 26 27 31 33 Lettres initiales du Prénom et du Nom: page 5 Question 2. Soit un fichier contenant des descriptions de produits selon le schéma relationnel suivant : PRODUIT (NumP, NomP, TypeP, Qté, Prix) Le fichier est placé sur disque par hachage statique multi-attributs sur les attributs NumP, NomP, et TypeP. Le hachage permet de générer pour chaque tuple le numéro du paquet où le tuple sera stocké. On suppose que la taille d'un paquet est celle d'un bloc disque. Le numéro des paquets est composé de résultant de l'application d'une fonction de hachage à NumP, p2 bits résultant de l'application d'une fonction de hachage à NomP, et p3 bits à TypeP, i.e., h1(NumP) Æ b11b12b13…b1p1 h2 (NomP) Æ b21b22b23…b2p2 h3 (TypeP) Æ b31b32b33…b3p3 => N°Paquet(tuple) = < b11b12b13…b1p1 / b21b22b23…b2p2 / b31b32b33…b3p3> P1 bits P2 bits P3 bits a) Calculer le nombre d'E/S à effectuer pour exécuter les requêtes suivantes : 1. recherche des produits tels que NumP = 100; 2. recherche des produits tels que NomP = 'Calculateur' et TypeP = 'T1' 3. recherche des produits tels que NomP = 'Calculateur' ou TypeP = 'T1' 4. insertion du produit (100, 'Calculateur', 'T1', 20, 15000) 1. NumP = 100 implique que les p1 bits issus de la fonction de hachage sur NumP sont fixés (i.e., connus). Les p2 et p3 bits issus du hachage de NomP et TypeP restent quant à eux inconnus, et donc il faut essayer toutes les combinaisons possibles, ce qui donne : Lettres initiales du Prénom et du Nom: page 6 2P2+P3 adresses possibles => 2P2+P3 E/S. 2. Dans cette requête, on a les valeurs de P2 et P3, mais non de P1. Cela veut dire qu'il faudra varier les p1 bits inconnus => 2P1 E/S 3. Dans cette requête, P2 bits sont fixés pour avoir les tuples tels que NomP = 'Calculateur', et p3 bits sont fixés pour avoir les tuples tels que TypeP = 'T1'. Pour avoir tous les tuples qui satisfont l'une OU l'autre des conditions => 2P1+P3 + 2P1+P2 E/S 4. Pour insérer un tuple, il faut lire la page disque où il faut le stocker puis la réécrire après insertion (cette page est bien évidemment déterminée par les trois fonctions de hachage). En supposant qu'il n'y a pas de débordement, il nous faut 2 E/S. b) Sachant que les fréquences d'interrogation sur chaque attribut NumP, NomP, TypeP sont respectivement f1, f2, et f3, calculer le nombre de bits optimal à allouer dans la composition du numéro de paquet pour NumP, NomP, et TypeP. Il faut que le nombre de bits issus d'une fonction de hachage sur un attribut soit déterminé en fonction de la fréquence d'accès sur l'attribut => plus on accède à un attribut, plus on lui alloue des bits. De cette façon, si la valeur de l'attribut est connue, une plus grande partie de la clé globale sera déterminée. Soit n = p1 + p2 + p3 le nombre total des bits de la clé. Une allocation optimale des bits serait alors : p1 = [f1 * n], p2 = [f2 * n], et p3 = [f3 * n]. Exercice 3 : ODMG et OQL On considère le schéma ODMG suivant : Classe Adresse { Attribute number numero ; Attribute string rue ; Attribute string ville ; } Classe Personne (extent LesPersonnes) { 4 pts Lettres initiales du Prénom et du Nom: Attribute string nom ; Attribute string prenom ; Attribute string sexe ; Attribute Adresse adr ; Attribute list(string) activites ; Relationship set(Personne) enfants inverse Personne :: parents ; Relationship list(Personne) parents inverse Personne ::enfants ; } Question 1 (3pts). Ecrire en OQL les requêtes suivantes : R1. Nom et prénom des personnes ayant des petits-enfants habitant Lyon. Réponse : Select P.nom, P.prenom from P in LesPersonnes, E in P.enfants, PE in E.enfants Where PE.adr.ville = ‘Lyon’; R2. Enfants dont un des parents pratique le ski. Réponse : R3. Nom et prénom des enfants dont les parents n’habitent pas la même ville. Réponse : Select E.nom, E.prenom from E in LesPersonnes, P1 in E.parents, P2 in E.parents Where P1.sexe=’M’ and P2.sexe=’F’ and P1.adr.ville <> P2.adr.ville page 7 Lettres initiales du Prénom et du Nom: page 8 Question 2 (1pt). Parmi l’ensemble des activités, on souhaite distinguer les activités sportives, pour lesquelles on indiquera la catégorie de la personne (poussin, benjamin, senior,…), et le jour de pratique du sport. Modifier le schéma en conséquence. Réponse : on définit une classe Activités et une sous-classe ActivitéSportive de la façon suivante : Class Activites { Attribute string nom ; } Class ActiviteSportive : Activites { Attribute string categorie ; Attribute string jour; } On modifie le champ activités de la classe Personne de la façon suivante : Attribute Activites activ ; Exercice 4 : Questions TME 2 pts Question 1 On considère la relation SOURCE (OWNER, NAME, TYPE, LINE, TEXT), décrivant le code source de tous les objets stockés d’un utilisateur. Les attributs de la relation sont décrits ci-dessous : OWNER VARCHAR2(30) : propriétaire de l’objet. NAME VARCHAR2(30) : nom de l’objet TYPE VARCHAR2(12) : type de l’objet (PROCEDURE, PACKAGE, FUNCTION, PACKAGE BODY, TRIGGER, TYPE, TYPE BODY ) LINE NUMBER : numéro de la ligne du code source TEXT VARCHAR2(4000) : texte source de l’objet Lettres initiales du Prénom et du Nom: page 9 Question 1. Ecrire la procédure Affiche (nom, ligne1, ligne2) pour afficher le morceau de code source (ligne1 à ligne2) de la procédure dont le nom est passé en paramètre. Create or replace procedure Affiche ………. Réponse : Create or replace procedure Affiche(nom source.name%type, li1 number, li2 number) is Cursor c is select distinct line, text from source Where name=nom and line<=l1 and line>=l2; L source.line%type; T source.text%type; Begin DBMS_OUTPUT.ENABLE (100000); Dbms_output.put_line(‘code source de la méthode ‘ || nom || ‘;’); Dbms_output.put_line(lpad(‘ligne’, 7, ‘ ‘) || ‘ ‘ || rpad(‘text’, 70, ‘ ‘) ) ; Dbms_output.put_line(rpad(‘-‘, 46, ‘-‘)) ; Open c; Loop Fetch c into l, t; Exit when c%notfound; Dbms_output.put_line(lpad(1, 7, ‘-‘) || ‘ ‘ || rpad(t, 70, ‘ ‘) ); End loop; Close c; End; Question2. Donnez l’instruction permettant d’exécuter la procédure qui affiche le code source de la fonction F1 de la ligne 1 à la ligne 10. Réponse : Begin Affiche(‘F1’,1,10); End; Exercice 5 : SQL3 On considère une base de données dont le schéma Entité/Association est donné ci-dessous : 8 pts page 10 Lettres initiales du Prénom et du Nom: : marié_à numéro nom : prenom rue Personne Habite Maison : age : : : : : enfant_de Située Contient : : Ville CodePostal Pièce Nom Type Taille On précise qu’une personne habite une maison (résidence principale) et peut éventuellement avoir une (seule) résidence secondaire. Il n’y a pas de maison non habitée, ni de ville sans habitant, ni de polygamie. Question 1 ( 0,5 points) Compléter le schéma précédent en indiquant les cardinalités maximum:minimum dans les cadres prévus à cet effet. On rappelle que les cardinalités s’expriment d’une entité vers une association, la flèche indique le sens de lecture pour les associations réflexives. Maison 1:N habite 1:2 Personne Maison 1:1 Située 1:N Ville Personne 0:1 marié_à 0:1 Personne Personne 0:2 enfant_de 0:N Personne Question 2 ( 0,5 points) Lettres initiales du Prénom et du Nom: page 11 Quelle contrainte d’intégrité sur un ou des attribut(s) de Personne est induite par l’association enfant_de ? Répondre par une phrase en français. L’age d’une personne est inférieur à celui des ses parents Question 3 ( 2 points) Compléter la série d’instruction SQL3 suivante pour créer le schéma d’une telle base de données. Vous ne pouvez pas créer de type supplémentaire ni de table supplémentaire. CREATE TYPE Personne; CREATE TYPE Piece AS OBJECT( ………………………………… ………………………………… ………………………………… ); CREATE TYPE Ville AS OBJECT( nom VARCHAR2(50), codePostal VARCHAR2(5) ); CREATE TYPE LesPieces AS ………………………………Piece; CREATE TYPE Maison AS OBJECT( numéro NUMBER(3), rue VARCHAR2(30), situé contient ……………………………………. ………………………………………., ); CREATE TYPE EnsMaisons AS ………………………………………………… Maison; CREATE TYPE EnsParents AS ………………………………………………. Personne; CREATE TYPE Personne AS OBJECT ( Lettres initiales du Prénom et du Nom: nom …………………………………………………, prénom …………………………………………………, age …………………………………………………, habite …………………………………………………, marié_à …………………………………………………, enfant_de ………………………………………………… CREATE TABLE LesPersonnes OF ……………………….. ……………………………………………………………….. ……………………………………………………………….. ; CREATE TABLE LesVilles OF ……………………….. ……………………………………………………………….. ……………………………………………………………….. ; CREATE TABLE LesMaisons OF ……………………….. ……………………………………………………………….. ……………………………………………………………….. ; CREATE TYPE Personne; CREATE TYPE Piece AS OBJECT ( type VARCHAR2(20), taille NUMBER(2) ); CREATE TYPE Ville AS OBJECT ( nom VARCHAR2(50), codePostal VARCHAR2(5) ); CREATE TYPE LesPieces AS TABLE OF REF Piece ); page 12 Lettres initiales du Prénom et du Nom: page 13 CREATE TYPE Maison AS OBJECT ( numéro NUMBER(3), rue VARCHAR2(30), situé REF Ville, contient LesPieces ); CREATE TYPE EnsMaisons AS VARRAY(2) OF REF Maison; CREATE TYPE EnsParents AS VARRAY(2) OF REF Personne; CREATE TYPE Personne AS OBJECT ( nom VARCHAR(20), prénom VARCHAR(20), age NUMBER(3), habite EnsMaisons, marié_à REF Personne, enfant_de EnsParents ); CREATE TABLE LesPersonnes OF Personne ; CREATE TABLE LesVilles OF Ville ; CREATE TABLE LesMaisons OF Maison NESTED TABLE contient STORE AS tabpieces; Question 4 ( 5 points) Soit le schéma objet-relationnel de la question précédente. 4.1) Insertion/mise à jour (2 Points) • Insérer dans la base le bébé Jean Peuhplu qui vient de naître, fils de Claude Peuhplu et Martine Hique, et qui habite 3 rue du Soleil à Paris, 20ème. Lettres initiales du Prénom et du Nom: page 14 Lettres initiales du Prénom et du Nom: page 15 INSERT INTO LesPersonnes VALUES Personne( ‘Peuhplu’, ‘Jean’, 0, LesMaisons((SELECT REF(i) FROM LesMaisons i WHERE i.rue=’du Soleil’ AND i.numero=3 AND i.situé.codePostal=’75020’)), NULL, LesParents( (SELECT REF(j) FROM LesPersonnes j WHERE j.nom = ‘Peuhplu’ and j.prénom=’Claude’ ), ((SELECT REF(j) FROM LesPersonnes j WHERE j.nom = ‘Hique’ and j.prénom=’Martine’ ) ); • Pour fêter l’heureux événement, les parents de Jean Peuhplu décide de se marier. Mettez la base à jour en conséquence. Lettres initiales du Prénom et du Nom: UPDATE LesPersonnes p SET p.marié_à = (SELECT REF(i) FROM LesPersonnes i WHERE i.nom=’Hique’ AND i.prénom=’Martine’) WHERE p.nom=’Peuhplu’ AND p.prénom=’Claude’ ; UPDATE LesPersonnes p SET p.marié_à = (SELECT REF(i) FROM LesPersonnes i WHERE i.nom=’Peuhplu’ AND i.prénom=’Claude’) WHERE p.nom=’Hique’ AND p.prénom=’Martine’ ; 4.2) Requêtes (3 points) Donner le code SQL des requêtes suivantes : 1) Dans quelle(s) ville(s) habite Edgar Dunord (donner le nom de la ville) page 16 Lettres initiales du Prénom et du Nom: page 17 SELECT m.situé.nom FROM EnsMaison m WHERE m IN (SELECT p.habite FROM EnsPersonne p WHERE p.nom=’Dunord’ and p.prenom=’Edgar’); Ou bien select m.situe.nom from LesPersonnes p , table(p.habite) m where p.nom = ’Dunord’ and p.prenom=’Edgar’; 2) Donner le prénom des personnes qui habitent avec leur conjoint SELECT p.prénom from LesPersonnes p WHERE (p.habite[1] IN p.marié_à.habite) OR (p.habite[2] IN p.marié_à.habite) 3) Adresse (numéro, rue, code postal) des maisons de + de 5 pièces Lettres initiales du Prénom et du Nom: SELECT m.numéro, m.rue, m.situé.codePostal from LesMaisons m WHERE 5 < (SELECT COUNT(*) FROM m.contient) 4) Les couples (nom et prénom des deux conjoints) SELECT p1.nom, p1.prénom, p2.nom, p2.prénom FROM LesPersonnes p1, LesPersonnes p2 WHERE p1=p2.marié_à ; Ou bien page 18 Lettres initiales du Prénom et du Nom: select p.nom, p.prenom, p.marie_a.nom, p.marie_a.prenom from LesPersonnes p where not(p.marie_a isnull) page 19