Bda TD
Bda TD
Bda TD
Exercices
4 Jointures 9
4.1 Algorithmes de Jointures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
4.2 Evaluation d’une requête . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
5 Optimisation et EXPLAIN 10
5.1 Optimisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
5.2 EXPLAIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
6 Choix de stockage 12
6.1 Choix de schéma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
6.2 Oracle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
6.3 DB2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
6.4 SQL Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
7 Tuning de requêtes 14
7.1 Amélioration de requêtes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
7.2 Indexation de fonction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
7.3 Vue matérialisée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
7.4 HINT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1 Stockage dans un SGBD
Le schéma de base de données suivant, ainsi que ses statistiques, seront utilisés dans l’ensemble
des exercices du cours.
1.1 Stockage
1. Calculer la taille d’une page utile (DataBlock), sachant que l’entête d’une page est de 192 octets
2. Calculer en nombre de pages, la taille de chaque table en nombre de pages (proposer le résultat
sous forme de tableaux)
3. Aucun index n’est encore créé. Combien coûte la requête suivante :
4. Supposons que la table soit fragmentée sur le disque de manière aléatoire, et un temps de
latence de 9 ms en moyenne par secteur (page). Quel temps faut-il pour évaluer la requête
précédente ?
5. Le stockage et le typage des données n’est pas idéale, proposez des améliorations possibles et
recalculer les pages 1
6. Un index sur l’attribut Localisation aiderait à accéder uniquement à la salle concernée. Afin
de retrouver le tuple, nous avons besoin d’un ROWID (pointeur logique). Détailler la composi-
tion d’un ROWID qui pourrait correspondre (après décompression) à ceci : 3.376.26.0
1. Pour la suite des exercices, nous n’utiliserons que les résultats obtenus dans la question 2
1.2. B+TREE CHAPITRE 1. STOCKAGE DANS UN SGBD
1.2 B+Tree
1. Nous souhaitons créer un index B+Tree sur l’attribut Identifiant de la table Salle. Donner
l’index B+Tree d’orbre 2 après insertion des valeurs suivantes. Vous ferez apparaître les étapes
d’éclatement :
100, 25, 72, 48, 10, 33, 58, 110, 40, 52, 115, 80, 5, 28, 49, 75
2. Donner la requête SQL de création de cet index.
3. Nous créons maintenant un index d’orbre 3 sur l’attribut Capacité de la table Salle, avec les
valeurs suivantes : 20, 30, 40, 20, 25, 200, 300, 150, 40, 20, 20, 50, 30
4. Lors de la création d’un index, on ne spécifie pas l’ordre de celui-ci. Il est calculé automati-
quement en fonction de la taille de l’attribut indexé, du ROWID associé à chaque valeur, et
de la taille d’une page (idem que pour les données). Calculer l’ordre de l’index sur l’attribut
Capacité.
5. Au vu de l’ordre d’un BTree, on peut estimer la hauteur de cet index (permet d’estimer son coût
de parcours). Donner la hauteur de l’index sur la Capacité.
1. Quelle est la hauteur maximum d’un index dense sur l’attribut id_Personne de la table Per-
sonne ?
2. Quelle est la hauteur maximum d’un index non-dense sur l’attribut id_Personne de la table
Personne ?
3. Donner la requête SQL (sous Oracle) pour la création de la table Personne en index non-dense
4. On souhaite maintenant ajouter un index sur l’attribut Personne, peut-il être un index non-
dense ?
2 Interrogation des indexes
1. Pour la requête suivante, donner le coût d’évaluation en séquentiel, index dense, index non-
dense :
SELECT Nom, Prenom FROM Personne WHERE Id_Personne = 125 ;
2. Idem pour la requête suivante, sachant la répartition des années de naissance dans l’histo-
gramme 2.1. Index sur l’année de naissance, dense (|I | = 3), non-dense (|I | = 2) :
SELECT Nom, Prenom FROM Personne WHERE Annee_Naissance = 1979 ;
3. Pour la requête précédente, on créer un index sur Annee_Naissance et couvrant sur Nom,
Prenom. Calculer l’ordre de l’index (Nom et Prenom sont stockés dans l’index), sa hauteur
max et le coût de la requête.
1. Donner le nombre de tuples résultats pour la requête suivante, sachant qu’il y a 10 000 prénoms
différents et 3,226% des personnes sont nées en 1979 :
SELECT Nom, Prenom FROM Personne
WHERE Annee_Naissance = 1979 AND Prenom = ’Nicolas’ ;
3.1 Bitmap
1. Donnez un exemple de bitmap pour la table Personne sur l’attribut Année, répartie de 1970 à
1992.
2. Quel est la taille d’un vecteur Année ?
3. Quel est la taille de l’index ?
Pour chaque requête, donner le coût avec un index dense sur l’Année (hauteur 3, 2,941% en 1979,
582 valeurs par feuilles) et avec le Bitmap sur l’année.
1.
SELECT COUNT(*) From Personne Where Annee = 1979 ;
2.
SELECT COUNT(*) From Personne Where Annee < 1980 ;
3.
SELECT Annee, COUNT(*) From Personne Group By Annee ;
On souhaite créer une table de hachage (ou table partitionnée) sur la table Reservation sur Id_Cours
(permet de regrouper les séances prévues pour un même cours dans une même partition).
1. Quel est le coût d’évaluation pour la requête suivante (BTree dense / non-dense de hauteur 3,
Hachage) :
SELECT Id_Salle, Date, heure_debut FROM Reservation WHERE Id_Cours = 300 ;
1. Donner le coût d’évaluation de la requête suivante avec les différents algorithmes de jointures.
Vous devrez calculer les tailles de résultats intermédiaires (avec PCTFREE 0%).
SELECT NOM, Prenom FROM Personne P, Cours C WHERE P.Id_Personne = C.Id_Enseignant;
5 Optimisation et EXPLAIN
5.1 Optimisation
Pour les requêtes suivantes, proposer un algorithme de jointure optimisé. Vous utiliserez les in-
dexes et les organisations physiques ci-dessous. Donner le plan EXPLAIN correspondant.
— BTree :
Index Hauteur ordre Type
Cours.Id_Cours 2 291 dense unique
Cours.Intitule 2 68 dense
Personne.Id_Personne 3 291 dense unique
Salle.Id_Salle 2 291 dense unique
Salle.Capacite 2 291 dense
Reservation.PK 2 136 non-dense unique
— Bitmap :
Index Taille vecteur Nb vecteurs
Personne.Annee 3 20
2.
SELECT COUNT(*)
FROM Personne P, Cours C
WHERE
P.Id_Personne = C.Id_Enseignant AND
Intitule like ’Base de Données%’ ;
WHERE
P.Id_Personne = C.Id_Enseignant AND
Annee = 1979 AND
intitule like ’Base de Données%’;
4. Il n’y a qu’une seule salle ’35.3.26’ et 0,14% des réservations sont dans cette salle.
SELECT Date, heure_debut, heure_fin
FROM Reservation R, Salle S, Cours C
WHERE
R.Id_Cours = C.Id_Cours AND
R.Id_Salle = S.Id_Salle AND
S.Localisation = ’35.3.26’ AND
intitule like ’Base de Données%’;
5.2 EXPLAIN
Donner la requête SQL correspondante et son coût d’exécution pour chacun des plans EXPLAIN
suivants :
1. 0,07% des réservations sont dans la salle 426, et 2% de celles-ci se passent le ’2012-10-05’.
0 SELECT STATEMENT
1 NESTED LOOPS
2* INDEX RANGE SCAN Reservation
3 TABLE ACCESS BY ROWID Cours
4 AND EQUAL
5* INDEX UNIQUE SCAN PK_Cours
6* INDEX RANGE SCAN Cours_Intitule
2. 0,07% des réservations sont dans la salle 426, et 2% de celles-ci se passent le ’2012-10-05’.
0 SELECT STATEMENT
1* SORT UNIQUE
2* SORT JOIN
3 MERGE JOIN
4* INDEX RANGE SCAN Reservation
5 MERGE JOIN
6 TABLE ACCESS BY ROWID Cours
7* INDEX RANGE SCAN Cours_Intitule
1. L’attribut Localisation n’est pas stocké de manière optimal. En effet, il est composé d’un nu-
méro d’accès, d’un numéro d’étage et d’un numéro de porte. Proposer un meilleur stockage
pour la table Salle.
2. Donner le nouveau schéma et la taille de la nouvelle table.
6.2 Oracle
1. Donner un tableau qui donne le nombre de pages contigües pour chaque extension (jusqu’à la
6°)
2. Donner le nombre d’extensions pour chacune des tables
3. Compte tenu du schéma de la table Réservation, comment pourrait-on améliorer son stockage ?
Donner la requête de création de table, en tenant compte de l’index non-dense.
4. Donner la nouvelle taille de la table Reservation et le nombre d’extension à partir de votre
requête de création. On gardera 192o dans une page pour les méta informations (malgré un
PCTFree de 0)
CHAPITRE 6. CHOIX DE STOCKAGE 6.3. DB2
6.3 DB2
1. On souhaite utiliser les possibilités de compression sous DB2 pour la table Personne. Donner
la requête DB2 permettant d’estimer la place éconimisée
2. Avec un PCTFREE de 0% (192o pour les méta informations) et une moyenne de compression
de 50% par tuple, donner la taille estimer en nombre de pages pour la table Personne.
3. Donner la requête de création de table compressée.
1. Après analyse des requêtes soumises au SGBD, on se rend compte que la requête type est :
SELECT Localisation
FROM Salle S, Reservation R
WHERE Date = ’2012−10−05’ AND
S.Id_Salle = R.Id_Salle ;
Les index présents sur la table Reservation sont inutiles pour cette requête. Dire pourquoi.
2. Proposer la création d’un index pour améliorer cette requête
3. Donner la requête de création de table sous SQL server pour créer un index non-dense sur
l’attribut Date de Reservation
7 Tuning de requêtes
Pour chacunes des requêtes suivantes, trouver l’erreur et proposer une nouvelle requête plus opti-
misée.
1.
SELECT NB
FROM (
SELECT Id_Salle, COUNT(*) AS NB
FROM Reservation
GROUP BY Id_Salle) R, Salle S
WHERE R.Id_Salle = S.Id_Salle AND
Localisation = ’35.3.26’
2.
SELECT Id_Salle, Localisation, Capacite, COUNT(*)
FROM Salle S, Reservation R
WHERE R.Id_Salle = S.Id_Salle
GROUP BY Id_Salle, Localisation, Capacite
3.
SELECT * FROM Personne WHERE Annee like ’%79’ ;
1. Dans le chapitre précédent (6.1), nous avions changé le schéma de la table Salle (Id_Cours,
Acces, Etage, Porte, Capacite). Toutefois, on souhaiterait continuer à faire des recherches de
type Localisation = ’35.3.26’ (ou équivalent). Proposer une solution.
2. Il est également possible d’utiliser le Pipeline pour générer cet accès en prenant la localisation
en entrée de la procédure pipeliné. Proposer une implémentation PL/SQL avec pipeline pour
intégrer la décomposition de la localisation.
CHAPITRE 7. TUNING DE REQUÊTES 7.3. VUE MATÉRIALISÉE
Le calcul de la requête suivante est trop couteux et effectué régulièrement sur la base de données :
SELECT Intitule, Acces, Etage, Porte, Date, Heure_debut, Heure_fin
FROM Cours C, Salle S, Reservation R
WHERE
C.Id_Cours = R.Id_Cours AND
R.Id_Salle = S.Id_Salle AND
C.Id_Cours = XXX ;
7.4 HINT
Les requêtes suivantes ne produisent pas le plan d’exécution attendu. Utiliser des HINTs qui per-
mettraient de leur donner la bonne orientation.
1. L’index BTree_Capacite n’est pas utilisé car les statistiques ne sont pas à jour :
SELECT Date, Heure_debut, Heure_fin
FROM Salle S, Reservation R
WHERE S.Id_Salle = R.Id_Salle AND
Capacite > 200
2. L’index bitmap_annee est utilisée alors qu’il génère un trop grand nombre de pointeurs :
SELECT Intitule
FROM Cours C, Personne P
WHERE P.Id_Personne = C.Id_Enseignant AND
ANNEE_Naissance = 1960 ;
3. Sur la requête précédente, on souhaiterait en plus forcer l’utilisation d’une jointure par boucle
imbriquée avec index et également qu’elle soit dirigée par la table Cours (en effet, un JoinHash
est généré mais ne tient pas en mémoire à cause d’une mauvaise répartition)