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