Vous êtes sur la page 1sur 68

Université de Versailles-St-

Quentin en Yvelines.

Mcanismes Internes des SGBDs


MIBD, Partie II

Version 2013
Laurent YEH

Contents
1 PROCEDURES STOCKEES PL/SQL 2

2 TRIGGERs 13

3 EXECUTION 17

4 OPTIMISATION 38

5 EXERCICES 61

1
PLAN DU COURS
 Extension procédurale (à travers PL/SQL)
 Introductionau langage PL/SQL
 Les variables
PL/SQL :  Traitements conditionnels
 Traitements répétitifs
 Les curseurs
 Gestion d’exceptions
 Procédures, Fonctions et Paquetages

L.Y. 1 L.Y. 2
2

1. Préambule : Qu'est ce que SQL3 ? Comparaison avec SQL2


 SQL : langage assertionnel et non procédural
 prochain standard SQL pour 98 ?
 implémenté en partie dans certains produits
 PL/SQL :
 extensions importantes :  langage procédural, qui intègre des ordres SQL
 extension procédurale - proche d’ADA (ex: PL/SQL d’Oracle)  SELECT, INSERT, UPDATE, DELETE
 au relationnel : assertions, triggers
 vers l’objet : UDT (dans Oracle 8)
 INSERT, UPDATE, DELETE
 gestion des transactions : COMMIT, ROLLBACK, SAVEPOINT
 langage à part entière comprenant
 Définition de variables, constantes, expressions, affectations
 Traitements conditionnels, répétitifs
 Traitement des curseurs (et de collections)
 Traitement des erreurs et d’exceptions
 Modularité (sous-programmes)

L.Y. 3 L.Y. 4
Section
Structure d'un bloc Exemple : CONTRÔLE de STOCK
Prompt nom du cru désiré
DECLARE Accept nom-Cru
Declare
<Declarative Section>
qte number (5) ;
BEGIN Begin
<Executable Section> Select quantité into qte From Stock
Where Cru= '&nom-Cru' ;
[EXCEPTION If qte > 0
<Exception handling Section> ] Then Update stock Set quantité = quantité - 1
Where produit = '&nom-Cru ' ;
END; Le bloc Insert into Ventes Values (&nom-Cru);
Else Insert into Commande Values (&nom-Cru);
end if;
commit;
L.Y. 5 end; L.Y. 6
3

Section
Types de variables utilisées Variables de type simple
Exemple :
Variables locales :
 de type simple : type de base ou booléen
Declare
 référence à la métabase nom char (15) ;
 de type composé : Tableau, Record salaire number (7, 2) ;
embauche DATE ; DD-MON-YY
Variables extérieures : réponse boolean ; valeur : TRUE, FALSE, NULL
■ variables d’un langage hote (ex: C) (préfixées par :)
■ paramètres (ex: SQL interactif) (préfixées par &)
■ champs d'écrans (Forms)

L.Y. 7 L.Y. 8
Variables sur la métabase Le type TABLE
 reprend :
 soit le même type qu'une colonne dans une table
 soit la même structure qu'une ligne dans une table ■ Déclaration du type :
 soit le même type qu'une variable précédemment définie TYPE nom_type IS TABLE OF
 syntaxe et exemple: {type_colonne | nom_table.nom_col%TYPE}
[NOT NULL] INDEX BY BINARY_INTEGER ;
nom_var1 table.colonne%TYPE
 novins vins.nvins%TYPE ;
nom_var2 table%ROWTYPE ■ Déclaration de la variable :
 enreg vins%ROWTYPE ; nom_var nom_type
nom_var3 nom_var1%TYPE
 qte_achat qte%TYPE ;

L.Y. 9 L.Y. 10
4

Le type RECORD Initialisation et visibilité


 initialisation par :
■ Déclaration de type :  opérateur :=, sections Declare, Begin et Exception
TYPE nom_type IS RECORD  ordre Select ... Into ... dans la section Begin
( {nom_champ1 {type_champ |  traitement d'un curseur
nom_table.nom_col%TYPE } [NOT NULL] ,  L'opérateur := :
nom_champ2 {type_champ | nom char (10) := ‘DURAND';
nom_table.nom_col%TYPE } [NOT NULL] , reponse boolean := TRUE;
... ) ;
 constante :
Exemple: TYPE t_rec_emp IS RECORD
(nom emp.ename%TYPE, salaire emp.sal%TYPE,comission emp.comm pi CONSTANT number (7,2) := 3.14;
%TYPE);  interdire les valeurs non renseignées : clause NOT NULL
rec_emp t_rec_emp;
debut number NOT NULL :=10;

L.Y. 11 L.Y. 12
Initialisation et visibilité Exemple
 L'ordre SELECT : Declare
Select col1, col2 nom char (15) ;
surface producteur.surf%TYPE ;
Into var1, var2 Begin
From table Select nom_prod, surf
[Where condition] ; Into nom, surface
From producteur
 Règle :
Where id = 234;
 la clause INTO est obligatoire ...
 le Select ne doit ramener qu'une ligne End;
 visibilité : bloc de déclaration + blocs imbriqués

L.Y. 13 L.Y. 14
5

Section
Traitements conditionnels
Exemple
Définition et syntaxe
 Définition : Declare
nom char (10) ;
 exécution d'instructions suivant le résultat d'une condition nv integer := 123 ;
 Syntaxe : mes char (30) ;
Begin
If condition1 Then traitement1 ; Select cru Into nom From vins Where nvins=nv;
elsif condition2 then traitement2 ; If nom is null then mes := nom || ‘pas connu';
elsif nom = ‘BORDEAU'
else traitement3 ; then mes := nom || ‘Un bon vin' ;
else mes := nom || 'pas bon' ;
end if; end if;
if;
 Opérateurs utilisés dans les conditions : insert into resultat values (mes) ; commit ; end ;
 ce sont les mêmes que dans SQL

L.Y. 15 L.Y. 16
Section
Répétitions La boucle de base
 Syntaxe :
LOOP [label]
 Définition : instructions ;
 possibilité d'effectuer des traitements répétitifs : clause END LOOP [label] ;
LOOP  sortie de boucle :
EXIT [label] [WHEN condition]
 Quatre types de boucles :  Exemple :
 la boucle de base Declare
nbre number := 1 ;
 la boucle FOR
Begin
 la boucle WHILE Loop
Insert into resultat values (nbre);
 la boucle CURSOR ... FOR
nbre := nbre + 1
Exit when nbre > 10 ;
End loop ;
End;
L.Y. 17 L.Y. 18
6

La boucle FOR La boucle while


 Syntaxe :  Syntaxe :
For indice In [Reverse] exp1 ... exp2 Loop While condition Loop instructions ;
instructions ; End loop ;
End Loop ;
 Exemple:
 Exemple Declare
Declare reste ct := 1 ;
fact Number := 1 ; Begin
Begin While ct <= 10 loop
For i in 1..9 Loop ct := ct + 1 ;
fact := fact * i ; end loop ;
End loop ; insert into resultat values (ct);
Insert into resultat values (fact, 'FACTORIELLE9') ; End ;
End;

L.Y. 19 L.Y. 20
Section
Curseurs Exemple Déclare
Définition et types
Declare
cursor prod_b is select nom, surf from producteurs
 zone de mémoire de taille fixe utilisée par le noyau where region = ‘bourgogne’ order by surf ;
Oracle pour analyser et interpréter tout ordre SQL. nom producteurs.nom%TYPE ;
surf producteurs.surf%TYPE ; Ouverture
 Deux types de curseurs : Begin
 le curseur implicite : généré et géré par le noyau pour Open prod_b ; Recupere
chaque ordre SQL d'un bloc Loop
Fetch prod_b into nom, surf ;
 le curseur explicite : généré et géré par l'utilisateur pour
If surf > 2500
traiter un ordre SELECT qui ramène plusieurs lignes then insert into résultat values (nom,surf);
 Utilisation d'un curseur explicite en 4 étapes: end if;
exit when surf = 5 000 ; Fermeture
 Déclarer, Ouvrir, traiter la ligne, fermer end loop ;
close prod_b;
End ;
L.Y. 21 L.Y. 22
7

Les attributs d'un curseur Les attributs d'un curseur (2)


 Définition : indicateurs sur l'état d'un curseur.  %ISOPEN : ouverture d'un curseur
 réponse TRUE si le curseur est ouvert
 %FOUND : dernière ligne traitée  curseur implicite : SQL%ISOPEN
 réponse booléen Oracle referme les curseurs après utilisation.
 TRUE : le dernier FETCH a ramené une ligne
 curseur explicite : nom_curseur%ISOPEN
 FALSE : plus de ligne
 %ROWCOUNT : nombre de lignes déjà traitées
 curseur implicite : SQL%FOUND  type : numérique
 curseur explicite : nom_curseur%FOUND  curseur implicite : SQL%ROWCOUNT
 Insert, Update, Delete : nbre de lignes ramenées
 Select :
 %NOTFOUND :  0 : ne ramène aucune ligne
 idem  1 : ramène exactement 1 ligne
à FOUND mais réponse inverse  2 : ramène plus d'une ligne
 curseur explicite : nom_curseur%rowcount
 nbre de lignes ramenées par le Fetch
L.Y. 23 L.Y. 24
Section
Exemple Simplification d'écriture
Declare
cursor prod_b is select nom, surf from producteurs
 déclaration de variables :
where region = ‘bourgogne’ order by surf ; Declare
nom producteurs.nom%TYPE ;
surf producteurs.surf%TYPE ; cursor nom_curseur is ordre_select ;
Begin
If not (prod_b%ISOPEN) then Open prod_b ; end if; nom_struct nom_curseur%Rowtype ;
Loop  attribut de la structure accès par :
Fetch prod_b into nom, surf ;
Exit when prod_b %NOTFOUND or nom_struct.nom_colonne
prod_b %ROWCOUNT > 15;
 structure renseignée par le Fetch :
If surf > 2500
then insert into résultat values (nom,surf ); Fetch nom_curseur into nom_struct ;
end if;
end loop ;
close prod_b ;
End ;
L.Y. 25 L.Y. 26
8

Simplification d'écriture
Exemple  curseurs dans les boucles.
Declare For enr in nom_curseur loop
cursor c1 is select nom, surf from producteurs order by surf ; traitement
c1_rec c1%ROWTYPE ;
Begin
end loop ;
Open c1;  Application à l’exemple précédent
Loop Declare
Fetch c1into c1_rec ; cursor c1 is select nom, surf from producteurs order by surf ;
Exit when c1%NOTFOUND ; Begin
If c1_rec.surf> 2500
then insert into résultat For C1_rec in c1 loop
If c1_rec.surf > 2500 then
values (c1_rec.nom,c1_rec.surf);
insert into résultat values (c1_rec.nom,c1_rec.surf);
end if; end if;
end loop ; end loop ;
close c1;
End ;
End

L.Y. 27 L.Y. 28
Simplification d'écriture Curseur paramétré
 Déclaration du curseur dans la boucle FOR :  Objectif : réutiliser un même curseur avec des
 Syntaxe : valeurs différentes dans un même bloc PL/SQL
For enrord in (SELECT ...)
Loop  Syntaxe :
Traitement ;
End Loop ; évite la déclaration du curseur.
 Exemple :
Declare
Begin cursor nom_curseur (par1 type, par2 type, ...) is
For enr in (select nom, surf from producteurs order by surf ) ordre_select
Loop
If enr.surf > 2500 Begin
Then Insert into résultat Open nom_curseur (val1, val2, ...) ;
Values (c1_rec.nom,c1_rec.surf);
End if ;
End loop ;
End ;
L.Y. 29 L.Y. 30
9

Exemple
Prompt Nombre de tuples
La clause CURRENT OF
Accept nb
Declare
 Objectif :
Cursor c1 (psurf number) is select nom, surf  Accéder directement en modification ou en suppression à
from producteurs where surf = psurf ; la ligne ramenée par Fetch
Begin
 il faut verrouiller les lignes lors de la déclaration du
For v in (select nom,surf from producteurs)
loop curseur ( ... For Update of nom_col ...)
exit when v%rowcount > &nb ;
For p in c1 (v.surf)
Loop
Insert into resultat
values (p.surf, v.nom || ‘ meme surf
que : ' || p.nom);
End loop ;
End loop ;
end ;
Select * from resultat;
L.Y. 31 L.Y. 32
Section
Gestion des erreurs
Exemple 1 Section Exception
Declare  Notion d'exception : traitement d'erreurs
Cursor c1 is select select nvins, qte from recoltes
for update of qte ;
 Types d'erreurs :
Begin  erreurs internes Oracle (Sqlcode <> 0)
For c1_rec in c1  erreurs programme utilisateur
Loop If c1_rec.qte > 1 500
Then Insert into resultat
 Règles à respecter :
values (c1_rec.nvins, c1_rec.qte - 8);  définir et donner un nom à chaque erreur
 associer ce nom à la section Exception (partie declare)
Update recoltes set qte = qte - 8  définir le traitement dans la partie Exception
Where Current of c1 ; end if,
end loop ;
end;
L.Y. 33 L.Y. 34
10

Anomalies du programme Exemple


Declare
■ Syntaxe : pas_surf EXCEPTION ;
Declare nom producteurs.nom%TYPE ;
nom_erreur exception ; surf producteurs.comm%TYPE ;
Begin
...
Select nom, surf into nom, surf,
Begin from producteurs where nprod = 10 ;
... If surf = 0 or surf is null
If (anomalie) then raise nom_erreur ; Then raise pas_surf
... Else (traitement) ; end if ;
Exception When pas_surf
Exception When nom_erreur then (traitement) ;
then insert into resultat values
(nom, 'pas de surf') ;
■ Sortie du bloc après exécution du traitement End ;

L.Y. 35 L.Y. 36
Gestion d’erreurs Exemple
Syntaxe : Exemple : traiter l'erreur 1002 : Fetch out of sequence
Declare...
nom_erreur exception ; Declare
pragma_exception_init (nom_err, code_err) ; fetch_out_of exception;
... pragma_exception_init (fetch_out_of, - 1002);
Begin Begin
... Traitement du curseur
si erreur Oracle, passage automatique dans la ...
section Exception. Exception
Exception When nom_erreur then (traitement) ; When fetch_out_of then (traitement erreur) ;
[When others then (traitement) ; ] End ;

L.Y. 37 L.Y. 38
11

Diagnostic d’erreurs Exemple


 SQLCODE : renvoie le code de l'erreur courante
Declare
(valeur numérique) pnom char (10) ;
code number ;
lg number ;
 SQLERRM [(code_erreur)] : mess char (50) ;
 renvoie le libellé de l'erreur courante. Begin
Select nom into pnom from producteurs Where nprod = 9999 ;

Exception
When others then code := sqlcode ;
mess := sqlerrm ; lg := length (mess) ;

Insert into resultat values (code, lg, mess) ;


Commit ;
End ;
L.Y. 39 L.Y. 40
Section
Exemple de procédure
Sous-Programme: Déclaration
procedure offre_promo (levin number) is -- et pas number(4)
 Procédures ou fonctions stockées dans le schéma prime REAL;
 offrent la modularité err_promo EXCEPTION;
 profitent de toute la gestion du dictionnaire (droits,...) Begin
 intégrés au moteur SQL => plus efficaces Select qte*0.25 Into prime
From recolte Where nvins=levin;
 Syntaxe
IF prime IS NULL THEN
Procedure son_nom (arg [in|out|IN OUT] Type,...) IS
RAISE err_promo;
ou Function son_nom (arg [in|out|IN OUT] Type,...) Return Type
ELSE
IS
UPDATE promotion SET qte=qte+prime WHERE nvins=levin;
[declarations locales]
END IF;
Begin
Traitement
EXCEPTION
[Exception ...] When err_promo THEN ...
End son_nom; END offre_promo;

L.Y. 41 L.Y. 42
12

Exemple de package
Exemple de fonction et passage par ref
Function Qte_ok (levin number) Return BOOLEAN is package actions_vins is -- spécification
laqte integer; procedure offre_promo (nvin number);
Begin procedure tester (nvin number, nom char, ...);
Select qte into laqte From recolte Where nvins= levin; procedure perte (nvin number);
Return (laqte>=100) AND (laqte <= 10000); END actions_vins ;
END Qte_ok ;
package BODY actions_vins is
■ Utilisation :
procedure offre_promo(nvin number) IS ...
IF Qte_ok(
Qte_ok 123) THEN …
procedure tester (nvin number, nom char, ...) IS
Begin INSERT INTO vins (...)
Procedure Add_10 (resu in out number) is
End embauche;
Begin
procedure perte (nvin number) IS ...
resu:=resu+10;
END Add_Qte ; END actions_vins ;

A:=6; Add_10(A); – Afficher A;L.Y.donne 16 43 L.Y. 44


 Un trigger est une instruction SQL qui est exécutée
automatiquement par le système avec un effet de bord
(conduisant à la modification de la base de données).!
 Pour définir un trigger, il faut:!
 Spécifier les conditions selon lesquelles le trigger doit
être exécuté!
 Spécifier les actions à prendre lorsque le trigger
sʼexécute!
 Les triggers sont un standard depuis SQL:1999. /!\
parfois la syntaxe des triggers nʼest pas standard…!
 Exemple : Oracle utilise :new et :old, MySQL utilise NEW,
etc…!

Database System Concepts, 6th Ed.!


©Silberschatz, Korth and Sudarshan
www.db-book.com"
©Silberschatz, Korth and Sudarshan"
Traduction Française : B. Nguyen" Mécanismes Internes des Bases de Données" 3.2" Tr. B. Nguyen"
13

Triggers 2/" Gestion des Triggers"


Formellement :"
 Définition!
 Action ou ensemble d'actions déclenchée(s) automatiquement lorsqu'une
CREATE [OR REPLACE ] TRIGGER <nom-trigger>
condition se trouve satisfaite après l'apparition d'un événement!
<événement> [<condition>] <action>*
 Un déclencheur est une règle ECA! DROP TRIGGER <nom-trigger>
 Événement = mise à jour d'une relation (INSERT, DELETE, UPDATE)!
ALTER TRIGGER <nom-trigger> ENABLE
 Condition = optionnelle, équivaut à une clause WHERE!
 Action = exécution de code spécifique (ordre SQL ou PL/SQL)! ALTER TRIGGER <nom-trigger> DISABLE
 Requête SQL de mise à jour, exécution d'une procédure stockée,  La création dʼun trigger déclenche son activation!
abandon d'une transaction, ...!
 On peut remplacer la version précédente dʼun trigger!
 De multiples usages sont possibles!
 On peut manuellement activer/désactiver un trigger!
 Étendre les mécanismes de contrôle dʼintégrité!
 Validation des données entrées, maintien de règles dʼintégrité
complexes!
 Contrôle dynamique et évolutif des manipulations de la BD!
 Maintien de statistiques, audit de la base!
 Duplication !
 Mise à jour de copies multiples, Dérivation des données additionnelles!
 Mise à jour au travers de vues!
©Silberschatz, Korth and Sudarshan" ©Silberschatz, Korth and Sudarshan"
Mécanismes Internes des Bases de Données" 3.3" Tr. B. Nguyen" Mécanismes Internes des Bases de Données" 3.4" Tr. B. Nguyen"
Syntaxe 1/" Syntaxe 2/"
CREATE TRIGGER <nom-trigger> <événement> [<condition>] <action>*  Lʼaction est définie dans un script PL/SQL. En particulier il permet
<événement> ::= lʼutilisation de IF … THEN … ELSE … END IF; Notez aussi que
BEFORE | AFTER | INSTEAD OF chaque instruction doit être suivie dʼun ; !
{INSERT | DELETE | UPDATE [OF <liste_colonnes>]}
ON <nom_de_table>  Il peut être très pratique dʼutiliser des variables, définies par le mot clé
DECLARE.!
<condition> ::=
[REFERENCING OLD AS <nom_tuple> NEW AS <nom_tuple>  Ces variables peuvent être initialisées par des requêtes en utilisant le
FOR EACH ROW] mot clé INTO ou modifiée par des instructions PL/SQL avec la
[WHEN <condition_SQL>]
commande := !
<action> ::=
{requête_SQL [FOR EACH ROW] | exec_procédure | create or replace trigger salaire_limite
COMMIT | ROLLBACK} before update of salary on instructor
Exemples for each row
declare
maxsalary INTEGER;
create or replace TRIGGER salaire_croissant CREATE TRIGGER référence_vins begin
before update on instructor
for each row BEFORE DELETE ON Vins maxsalary := 100000;
if ((:new.salary < :old.salary) or (:new.salary > maxsalary))
begin FOR EACH ROW then raise_application_error(-20001, 'probleme'); rollback;
if :new.salary < :old.salary
DELETE FROM Abus end if;
then raise_application_error (-20001, ‘pb’); end;
end if; WHERE Abus.id_vin = Vins.id
end;

©Silberschatz, Korth and Sudarshan" ©Silberschatz, Korth and Sudarshan"


Mécanismes Internes des Bases de Données" 3.5" Tr. B. Nguyen" Mécanismes Internes des Bases de Données" 3.6" Tr. B. Nguyen"
14

MAIS : Triggers des SGBD commerciaux" Trigger garder à jour le nombre de crédits"

create or replace trigger takes_t2!


 Différences avec le standard! after update on TAKES!
 Oracle! for each row!
 1 seul trigger déclenché par un même évènement! when (new.grade <> 'F' and new.grade is not null and (old.grade = 'F' or
 Condition : ne peut contenir de requête SQL! old.grade is null))!
 Action : ! begin!
 1 bloc PL/SQL anonyme sans COMMIT/ROLLBACK! update student set tot_cred = tot_cred + (select credits from course
 Pas de mise à jour de la table ayant levé le trigger! where course.course_id = :new.course_id) where student.id = :new.id;!
 Pas de lecture de la table ayant levé le trigger ligne! end;!
 Informix!
 Condition : ne peut contenir de requête SQL!
 Action!
 1 seul ordre PL/SQL !
 ou 1 seul appel de procédure/fonction!

©Silberschatz, Korth and Sudarshan" ©Silberschatz, Korth and Sudarshan"


Mécanismes Internes des Bases de Données" 3.7" Tr. B. Nguyen" Mécanismes Internes des Bases de Données" 3.8" Tr. B. Nguyen"
Problème de table mutante 2/"
 On veut calculer une valeur dynamique dans un trigger!  Lʼerreur signifie quʼon accède à la table alors quʼelle est en cours de modification.!
 Considérons lʼexemple suivant pour comprendre pourquoi il peut y avoir un problème :!
 Cette valeur peut dépendre de la table qui est en train de changer!  Supposons qu'on veuille gérer manuellement, par le biais d'un déclencheur, une contrainte
 Le trigger sera validé, mais il y aura une erreur à lʼexécution! d'unicité sur une colonne numérique qui contient initialement les valeurs 1, 2, 3, 4, 5.!
 CREATE TABLE TEST(COL1 INTEGER );!
 Cʼest le problèle de la « table mutante »!  Pour assurer l'unicité, on crée un déclencheur AFTER INSERT OR UPDATE FOR EACH
ROW, lequel va vérifier que la nouvelle valeur n'existe pas déjà dans la table.!
 Puis on exécute l'instruction suivante pour incrémenter COL1 de 1 dans toute la table :!
CREATE OR REPLACE TRIGGER salaire_limite  UPDATE TEST SET COL1=COL1+1;!
BEFORE UPDATE OF salary ON instructor  Pour la première ligne, l'incrémentation a lieu (1+1), puis le déclencheur vérifie si 2
FOR EACH ROW n'existe pas déjà. Il conclut que oui, en conséquence de quoi on va annuler la transaction.!
DECLARE
/!\ !Pourtant, si la vérification s'effectuait après le traitement de toutes les lignes, on aurait fort
maxsalary INTEGER; logiquement 2, 3, 4, 5, 6, valeurs pour lesquelles la contrainte d'unicité est respectée.!
BEGIN
select max(salary) into maxsalary from instructor;  L'utilité de la lecture cohérente de niveau instruction unitaire, c'est justement de ne pas
IF (:new.salary < :old.salary or :new.salary > maxsalary)
donner accès aux états transitoires des données, qui ne permettent de tirer aucune
conclusion valable. L'erreur ORA-04091 est donc un véritable signal d'alarme préventif.!
THEN raise_application_error(-20001, ʻpbʼ);!
END IF;  Il est à noter qu'Oracle ne garantit absolument pas l'ordre dans lequel seront traitées les
lignes au sein d'une instruction unitaire, cet ordre pouvant notamment dépendre des
END; !
options d'optimisation en vigueur.!

 Voir : http://sgbd.developpez.com/oracle/ora-04091/ !

©Silberschatz, Korth and Sudarshan" ©Silberschatz, Korth and Sudarshan"


Mécanismes Internes des Bases de Données" 3.9" Tr. B. Nguyen" Mécanismes Internes des Bases de Données" 3.10" Tr. B. Nguyen"
15

Problème de table mutante 3/" Table mutante 4/"


 Un certain nombre de solutions existent, la plus simple est dʼutiliser le
INSTEAD OF cʼest-à-dire que le code du trigger va remplacer le code
de la mise à jour.!
 Il faut donc court-circuiter la mise à jour en utilisant une vue, et en create or replace view t_instructor as select * from instructor;
faisant les MAJ au travers de la vue. Cʼest la vue elle-même qui va
devoir mettre à jour la table sous jacente !! create or replace trigger salaire_limite_v
instead of update on v_instructor
for each row
 Le trigger devra être défini sur la vue.!
declare
maxsalary INTEGER;
begin
select max(salary) into maxsalary from v_instructor;
 Autre possibilité : utiliser une table temporaire pour permettre la if :new.salary > maxsalary
communication (voir exercice).! then raise_application_error(-20001, 'probleme');
else update instructor set salary = :new.salary where ID = :new.ID;
end if;
end;

©Silberschatz, Korth and Sudarshan" ©Silberschatz, Korth and Sudarshan"


Mécanismes Internes des Bases de Données" 3.11" Tr. B. Nguyen" Mécanismes Internes des Bases de Données" 3.12" Tr. B. Nguyen"
 Au lieu de faire une action spécifique pour chaque tuple  Auparavant, les triggers étaient utilisés pour tout un tas de tâches,
affecté, une seule action peut être prise pour tous les tuples comme:!
affectés par une transaction!  Conserver des ʻrésumésʼ de données (comme le salaire de tout un
 Utiliser for each statement au lieu de for each row! département)!
 Utilisez referencing old table ou referencing new  La réplication!
table pour utiliser les tables de transition!  Aujourdʼhui il existe dʼautres (meilleures) manières de faire!
 Peut être plus utilie lorsquʼon traite un grand nombre de  Support de vues matérialisées pour faciliter la maintenance de
tuples avec une mise à jour! données agrégées!
 Support pour la réplication!
 Lʼencapsulation peut être utilisée au lieu des triggers!
 Permet de définir des méthodes pour mettre à jour les champs!
 Les actions sont effectuées dans les méthodes et non plus dans le
trigger!

©Silberschatz, Korth and Sudarshan" ©Silberschatz, Korth and Sudarshan"


Mécanismes Internes des Bases de Données" 3.13" Tr. B. Nguyen" Mécanismes Internes des Bases de Données" 3.14" Tr. B. Nguyen"
16

 Risque de déclenchement innapproprié!


 Chargement de backup!
 Réplication sur des sites distants!
 On peut désactiver lʼexécution de triggers pour ces cas là!
 Autres risques!
 Sʼil y a un échec ou une erreur dans le trigger, la transaction
lʼayant activé sera annulée  Attention aux erreurs dans les
triggers !!!!!
 Exécution en cascade de triggers!

©Silberschatz, Korth and Sudarshan"


Mécanismes Internes des Bases de Données" 3.15" Tr. B. Nguyen"
Architecture en couche d’un SGBD

Interface

Analyseur sémantique

Modèle d’exécution Optimiseur

Moteur d’exécution

Opérations relationnelles
Benjamin Nguyen
M2 ACSISs
Méthodes d’accès aux données

Gestion de Gestion de Gestion des


Mémoire Verrous Journaux
Support construit à partir des slides de
N. Anciaux, L. Bouganim, I; Manolescu, R. Ramakrishnan
Système opérationnel
1 2
17

Plan du cours Pourquoi trier ?


• Requêtes avec résultats triés
• Introduction : Algorithme de tri – Clause SQL ORDER BY
– Tri-fusion en 2 phases (2-Way Sort) SQL> SELECT DISCTINCT V.Lieu!
– Tri fusion général > FROM Visite V
> ORDER BY ASC V.jour;!

• Opérateurs relationnels • Utile pour éliminer les doublons


– Clause SQL DISCTINCT Pourquoi un tri ?
– Terminologie
– Algorithmes • Utile pour effectuer une jointure
– Calculs de coût – Algorithme de jointure par Tri Fusion (Sort Merge Join)
• Contexte base de données
• Problème de l’allocation mémoire aux opérateurs – Les données sont sur disque
– Et ne tiennent pas en mémoire…

• Oracle : Algorithmes implantés  Problème : trier 1 To de données avec 1 Go de RAM


Pourquoi ne pas utiliser la mémoire virtuelle ?
3 4
NB : tri en mémoire RAM Tri sur disque : 2 phases (2-Way Sort)
• Passe 0
• Algorithmes classiques – Lire une page, la trier, l’écrire
– Utilisation mémoire = 1 page
– Tri insertion
– Tri rapide (Quicksort) Page 1 IN/OUT Page 1 Page 2 … Page N

Page 2
– Tri à bulle RAM

– Tri par tas (‘heapsort’) Page N

– , etc. IN 1 IN 2

• Passes suivantes OUT

– Passe 1 RAM
• NB : Contexte base de données • Lire 2 pages
– Les données sont sur disque • Trier le résultat et l’écrire
• Utilisation mémoire : 3 pages
– Et ne tiennent pas en mémoire… Page 1
… Page N-1

– Passes 2 Page 2 Page N

• Lire 2 listes de 2 pages


• …
5 6
18

Coût du Tri en 2 phases Algorithme général du Tri Fusion


• Si on dispose de plus de 3 pages mémoire…
• A chaque passe : lecture et écriture du fichier complet – Comment optimiser le tri ?
– Soit 2 N I/Os 3,4 6,2 9,4 8,7 5,6 3,1 2
Fichier à trier

Passe 0 • Trier un fichier de N pages avec B pages en RAM (en fait B+1…)
3,4 2,6 4,9 7,8 5,6 1,3 2 – Passe 0 : utiliser B pages, produire ⎡N / B⎤ paquets (ou runs) triés de B pages
Passe 1
• Fichier de N pages 2,3 4,7 1,3
⎡N / B⎤ runs

– Nb de passes = ⎡log2 N ⎤ + 1 4,6 8,9 5,6 2


Page 1 IN 1
RAM
Page 1 Page 1 Page 1
Passe 2 Page 2 IN 2
– I/Os = 2 N ( ⎡log2 N ⎤ + 1 ) 2,3 …
OUT Page 2 Page 2 Page 2

4,4 1,2

IN B … …
… …
B pages

6,7 3,5 Page N


Page B Page B Page B
8,9 6
Passe 3 – Passes suivantes : fusionner (merge) B runs

1,2 Page 1 Page 1


RAM
IN 1
Fichier trié
2,3 Page 2 Page 2 IN 2


OUT
3,4 …
… …
4,5 IN B
• Optim. : stratégie ‘Devide & Conquer’ 6,6 Page BxB Page BxB

• Découper le fichier d’entrée 7,8

• Trier et fusionner les sous-fichiers 9 – Coûts ?


7 8
Coût du Tri Fusion Nombre de passes du Tri Fusion

• Nombre de passes = 1+ ⎡logB-1 ⎡N / B⎤ ⎤

• Coût I/Os = 2N x (nombre de passes)


– Lecture et écriture (complète) des pages du fichier à chaque passe

• Ex. 5 pages en RAM, pour trier 108 pages


– Passe 0: ⎡108 / 5⎤ = 22 runs triés de 5 pages chacun
(sauf le dernier run qui contient 3 pages)
– Passe 1: ⎡22 / 4⎤ = 6 runs triés de 20 pages chacun
(sauf le dernier run qui contient 8 pages)
– Passe 2: 2 runs triés, 80 pages et 28 pages
– Passe 3: fichier trié de 108 pages

9 10
19

Utilisation de l’arbre B+ Hiérarchie de la mémoire


• Hypothèse : un index, sous forme d’arbre B+, sur la clé de tri…
• Idée : retrouver les tuples dans l’ordre en traversant les feuilles Prix ($ / Go) Accès (ns) Débit (Mo/s)
• Est-ce une bonne idée ? 50 000 Cache processeur (L1/L2) 0.25ns
200 Go/s
– L’index est plaçant  Bonne idée
– L’index est non plaçant  Peut être une très mauvaise idée…
• Coût 5 RAM (DDR3) 1ns 20 Go/s
– De la racine à la feuille la plus à gauche
– Ensuite, retrouver toutes les feuilles (chaînées)… (x10-1)
4ms
• Arbre plaçant Clé K 0.1 Disques 300 Mo/s
– Toujours mieux qu’un Tri Fusion …K1… (x10-4)
…K2… …Kn…
Page 1 Page 2 Page i
Tuples triés sur K Clé L
Disques optiques 150ms 3 Mo/s
• Arbre non plaçant ?? (stockage “nearline”)
(x10-6)
…K1…
– Chaque feuille contient des Rid …K2…
…Kn…

– En général, 1 I/O par tuple ! Page 1 Page 2 Page i


Tuples non triés sur K
11 12
Les opérateurs Sélections σ : accès aux tuples
• Sélection (σ), sélection d’un sous ensemble des tuples d’une table
– Par Scan, par index
• Plusieurs chemins d’accès aux tuples peuvent être utilisés
– SCAN du fichier et évaluation en mémoire du critère (de la requête)
• Projection (π), retire certaines colonnes d’une table
– Accès par index aux tuples qui répondent au critère
– Par tri ou hachage, par index
• Jointure (∞), combine deux tables
• Un index basé sur du tri (arbre, table inversée)
– Par boucle
– Par tri ou hachage – Répond à une expression sur des attributs préfixes de la clé
– Par index – Ex. un index arborescents sur la clé <a, b, c>
• Répond à la sélection ‘a=5 AND b=3’, à ‘a=5 AND b>6’
• Autres opérations
• Ne répond pas à ‘b=3’
– Groupement, agrégats
– Ensemblistes : différence (-), Union (∪)
– Semi-jointure (∝) • Un index basé sur du hachage
• Chaque opérateur prend en entrée et renvoie une table – Répond à une conjonction de termes du type ‘attribut = valeur’
 possibilité de composer les opérateurs – Ex. un index haché sur <a, b, c>
• Répond à la sélection ‘a=5 AND b=3 AND c=5’
• NB: le problème d’optimisation (lié à cette composition) sera vu après… • Ne répond pas à ‘b=3’, à ‘a=5 AND b=3’, et à ‘a>5 AND b=5 AND b=3’
13 14
20

Sélection σ : utilisation des index (1) Sélection σ : utilisation des index (1)
• Le coût d’utilisation de l’index dépend • Le coût d’utilisation de l’index dépend
– Du nombre de tuples/Rid qualifiés – Du nombre de tuples/Rid qualifiés
– Du fait que l’index soit plaçant ou non – Du fait que l’index soit plaçant ou non
NB : qu’est-ce qu’un index plaçant ? Dense ? NB : qu’est-ce qu’un index plaçant ? Dense ? Tuples dans les feuilles = Plaçant; Sur un fichier
trié ne contenant pas toutes les clés = non dense

• Décomposition du coût • Décomposition du coût


– Coût de recherche des clés dans l’index (petit) – Coût de recherche des clés dans l’index (petit)
– Coût d’accès aux tuples (peut être gros si l’index est non plaçant) – Coût d’accès aux tuples (peut être gros si l’index est non plaçant)

• NB: critères de sélection d’abord convertis en ‘forme normale • NB: critères de sélection d’abord convertis en ‘forme normale
conjonctive’ conjonctive’
– ‘(jour<01-fev-07 AND Nom=‘Bob’) OR id=5 OR did=3’ – ‘(jour<01-fev-07 AND Nom=‘Bob’) OR id=5 OR did=3’
– FNC : ‘(jour<01-fev-07 OR id=5 OR did=3) AND (Nom=‘Bob’ OR id=5 – FNC : ‘(jour<01-fev-07 OR id=5 OR did=3) AND (Nom=‘Bob’ OR id=5
OR did=3)’ OR did=3)’
– On ne discutera que des cas sans OR… – On ne discutera que des cas sans OR…
15 16
Sélection σ : utilisation des index (2) Sélection σ : utilisation des index (2)
• Quand utiliser l’index • Quand utiliser l’index
– Si la sélectivité est ‘très’ petite – Si la sélectivité est ‘très’ petite
• Ex. • Ex.
SQL> SELECT *! SQL> SELECT *! 1) 1 appel, 1000 I/Os, ≈2 sec.
> FROM Medicament > FROM Medicament 2) Plusieurs appels (index), 100 I/Os, < 1 sec.
> WHERE M.Nom = ‘N%';! > WHERE M.Nom = ‘N%';! 3) Jusqu’à 10.000 I/Os, > 100 sec.

Quels sont les coûts de l’accès: Quels sont les coûts de l’accès:
1) Sans index; 2) Avec index plaçant sur Nom; 3) Avec index non plaçant sur Nom 1) Sans index; 2) Avec index plaçant sur Nom; 3) Avec index non plaçant sur Nom

– Médicaments = 100.000 tuples, 1000 pages contiguës; – Médicaments = 100.000 tuples, 1000 pages contiguës;
– Noms uniformément distribués; I/O = 10ms + nbpages x 0,2ms – Noms uniformément distribués; I/O = 10ms + nbpages x 0,2ms
– Il y a 10 % de médicaments commençant par un N (=‘N%’) – Il y a 10 % de médicaments commençant par un N (=‘N%’)
• NB : optimisation des accès aux données par index non plaçant • NB : optimisation des accès aux données par index non plaçant
– Trouver dans l’index les Rid qualifiés – Trouver dans l’index les Rid qualifiés
– Trier les Rid qualifiés – Trier les Rid qualifiés
– Accéder les tuples sur disque dans l’ordre des Rid – Accéder les tuples sur disque dans l’ordre des Rid
(pour ne pas accéder 2 fois la même page…) (pour ne pas accéder 2 fois la même page…)
17 18
21

Projection (1) Projection (2)


• L’opération coûteuse est l’élimination des doublons • Approche basée sur le hachage
– Phase de partitionnement
– SQL n’élimine pas les doublons • lire chaque page de la relation à projeter dans le buffer d’entrée
(sauf si la clause DISTINCT est spécifiée dans la requête) • Retirer les colonnes non désirées
• Hacher les tuples (fonction h1) vers l’un des B-1 buffer de sortie
SQL> SELECT DISTINCT D.Spé, D.Ville! • Résultat
> FROM Doc D ;!
– B-1 partitions (de tuples sans colonne non désirée)
• Algorithme – 2 tuples contenus dans 2 partitions différentes ne peuvent pas être des doublons
– Phase d’élimination des doublons
– Basé sur du hachage • Lire chaque partition,
• hacher <Spé, Ville> pour former des partitions, • Construire en mémoire une table de hachage (fonction h2),
• charger ces partitions en mémoire une par une, • Et supprimer les doublons
• NB:
• construire des structures basées sur le hachage en mémoire, – h2 doit être différente de h1
• et éliminer les doublons dans chaque partition – Si une partition ne tient pas en mémoire, lui appliquer récursivement la phase de
partitionnement
– Basé sur le tri
• Coût
• trier <Spé, Ville>,
– Partitionnement : lecture de la table, écriture du même nombre de tuples, mais
• et éliminer des doublons (NB: l’élimination intermédiaire possible) avec une taille plus petite (donc moins d’I/Os)
– NB: index de clé <Spé, Ville> peut optimiser le tri/hachage – Elimination des doublons : lecture des partitions
19 20
Projection (3) Jointure (et opérateurs similaires)
• Approche basée sur le tri • L’opérateur le plus étudié en BD
– Modification de la passe 0 du Tri Fusion pour éliminer les colonnes non
souhaitées en résultat • Variations de l’algorithme de jointure
• Les paquets obtenus en résultat contiennent donc des tuples plus petits que – Par boucle
les tuples de la table à trier
• Jointure par boucles imbriquées (Block Nested Loop Join)
– Modification des passes suivantes pour éliminer les doublons
• Le nombre de tuples résultats diminue d’une passe à l’autre • Jointure par boucles imbriquées avec un index (Index Join)
• Coût – Par tri
– Passe 0 : lecture de la table, écriture du même nombre de tuples, mais • Jointure par tri fusion (Sort Merge Join)
avec une taille plus petite (donc moins d’I/Os) – Par hachage
– Passes suivantes : moins de tuples produits à chaque passe • Jointure par hachage (Hash Join)
• Remarques sur cette approche • Jointure par hachage de Grace (Grace Hash Join)
– Le résultat est trié • Jointure par hachage hybride (Hybrid Hash Join)
– C’est l’implantation standard choisie par les éditeurs de SGBD – Par index
– Si on dispose d’un index sur la relation (index couvrant)
• Jointure par index (Index Join)
• Ayant pour clé les attributs à projeter
• Ou dont la clé a pour préfixe la liste d’attributs à projeter • NB : ces d’algorithmes peuvent êtres adaptés à d’autres
 un parcours (Scan) de l’index permet de faire la projection…
opérateurs binaires (intersection, différence, etc.)
21 22
22

Comparaison des algorithmes de jointure Boucles imbriquées (Block Nested Loop)


• On veut joindre les tables DOCteur et VISite • Algorithme
– DOC = relation externe (outer relation) de la jointure
FOR EACH tuples tD IN DOC
FOR EACH tuple tV IN VIS DO
• Chargement par bloc de B-1 pages IF tD.join_key == tV.join_key
– VIS = relation interne (inner relation) de la jointure THEN ajoute tD•tV au résultat
DOC id Nom spécialité …… VIS id docid date prix …… • Chargement par bloc d’une page en RAM END FOR
1 Joe Pédiatre …… 1 3 …… …… ……
END FOR
2 Bar Radiologue …… 2 2 …… …… ……
3 Doc Pneumologue …… 3 2 …… …… …… – Chaque tuple tD de IN1INB-1 joignant avec un tuple tS dans de INB ajoute un tuple <tD,tS> dans OUT
… … … …… 4 3 …… …… ……
5 1 …… …… …… DOC
6 1 …… …… …… RAM

Page D

Page 2

Page 1

IN M-2
DOC ∞ VIS

IN 2

IN 1


7 3 …… …… ……
• Coût = Nombre d’I/Os … … …… …… ……

Page K

Page 2

Page 1
OUT M
VIS


(on ne distingue pas I/Os séquentielles et aléatoires
Page V

Page 2

Page 1

IN M-1

on ne compte pas le coût d’écriture du résultat final)


• Paramètres • Remarques : Pas besoin d’index; Utilisable pour les inequi-jointures (<, >, etc.)
– |DOC| = Nombre de pages occupées par DOC • Coût en I/Os avec M pages disponibles en RAM
– ||DOC|| = Nombre de tuples dans DOC – Brute Force (M=3) : |DOC| + |DOC| × |VIS|
– Avec de la mémoire : chargement de la relation externe par bloc
– |DOC| << |VIS| • 3 < M < |DOC| (M pages de DOC)  coût = |DOC| + |DOC|/M × |VIS|
• M ≥ |DOC| (DOC tient en RAM)  coût = |DOC| + |VIS|
– M = Nombre de pages mémoire disponibles
(NB : quelques approximations pour simplifier les formules) 23 24
Jointure par index (Index Join) Jointure par index (Index Join)
• Hypothèses • Hypothèses
– Un index sur l’attribut de jointure de VIS (ou de DOC) – Un index sur l’attribut de jointure de VIS (ou de DOC)
– L’index a n niveaux et tient sur p pages – L’index a n niveaux et tient sur p pages
• Principe (équi-jointure) • Principe (équi-jointure)
– Choisir comme relation interne celle qui a un index sur sa colonne de jointure – Choisir comme relation interne celle qui a un index sur sa colonne de jointure
(ex. VIS) et utiliser l’index (ex. VIS) et utiliser l’index
FOR EACH tuple tD IN DOC FOR EACH tuple tD IN DOC
Accède les tuples tV de VIS de clé tD.join_key // index Accède les tuples tV de VIS de clé tD.join_key // index
ajoute tD•tV au résultat ajoute tD•tV au résultat
END FOR END FOR

Quel est l’intérêt de la technique ? Quel est l’intérêt de la technique ?

On évite la passe complète sur la relation interne pour


chaque (groupe de) tuple(s) de la relation externe

– Ex. pour chaque docteur, récupérer la clé de jointure, parcourir l’index sur visite et – Ex. pour chaque docteur, récupérer la clé de jointure, parcourir l’index sur visite et
retrouver les visites partageant cette clé retrouver les visites partageant cette clé
• Coût • Coût
– Brute Force (ou M = 3) – Brute Force (ou M = 3)
• Coût = |DOC| + ||DOC|| × n + ||VIS|| • Coût = |DOC| + ||DOC|| × n + ||VIS||
– M = |VIS| + p – M = |VIS| + p
• Coût = |DOC| + p + |VIS| • Coût = |DOC| + p + |VIS|
25 26
23

Ex. de jointure par index Jointure par Tri Fusion (Sort Merge Join)
• Indexation B+ de VIS sur VIS.docid (donc VIS est relation interne…) • Principe de l’algorithme : (équi-jointure DOC.id = VIS.docid)
– Trier DOC (resp. VIS) sur DOC.id (resp. VIS.docid)
• Hypothèses – Parcourir simultanément DOC et VIS pour ‘fusionner’ les tuples 1
VIS
id docid date ……
– |DOC| = 10, ||DOC|| = 1000, |VIS| = 1000, ||VIS|| = 100000 – Produire les tuples résultat 4 3 5 1 …… ……
– Index = 1000 clés, 100000 Rid  p = 100, n = 3 6 1 …… ……
• Détail de la ‘fusion’
• Coût de la jointure par index ? 1. Initialiser tD.id et tV.docid à 0 1
DOC 4 3 3 2 …… ……
id Nom spécialité …… 2 2 …… ……
Etc.
2. Parcourir DOC jusqu’à rencontrer 4 2 1 5 Pédiatre …… 4 3 …… ……
• Si l’index est plaçant • Si l’index est non plaçant un tuple tD / tD.id ≥ tV.docid 4 2 2 2 Radiologue …… 1 3 …… ……

• Parcours de DOC • Parcours de DOC 3. Parcourir VIS jusqu’à rencontrer Etc.


3
… …
1 Pneumologue

……
……
7

3

……
……
……
……
– 10 I/Os, soit 1.000 tuples un tuple tV / tV.docid ≥ tD.id
– 10 I/Os, soit 1.000 tuples 4. Recommencer 2 et 3 jusqu’à rencontrer
• Accès par index aux visites • Accès par index aux visites un couple tD, tV / tD.id = tV.docid 1 5 Pédiatre …… 5 1 …… ……
5
– Pour chaque tD 5. Alors tous les tuples du groupe joignent… 1 5 Pédiatre …… 6 1 …… ……
– Pour chaque tD
• 0≤I/Os<n pour trouver <clé, {rid}> Les produire 2 2 Radiologue …… 3 2 …… ……
• 0≤I/Os<n pour trouver <clé, {rid}> 5
(NB : partie de l’index en RAM…) 2 2 Radiologue …… 2 2 …… ……

(NB : partie de l’index en RAM…) • 1I/O par visites tV qui joint avec tD
• 1I/O pour toute visite tV qui joint avec tD – Total (min.) = 100.110 I/Os … et reprendre à 2 jusqu’à la fin du parcours de DOC et VIS
– Total (min.) = 1.110 I/Os NB : 10+100 (lecture index Min.)
NB : 10 + 100 (lecture index Min.) + +100000 (tuples de VIS) • Intuition sur le coût de la jointure
1000 (pages de VIS) – Coût du tri de DOC + coût du tri de VIS
27 – Coût de lecture de DOC et VIS pour fusionner (écriture du résultat non comptabilisée…) 28
Coût de la jointure par Tri Fusion Jointure par hachage (Hash Join)
• Phase de tri • Principe de l’algorithme : (équi-jointure DOC.id = VIS.docid)
– Phase de construction (build)
– Coût du tri des tuples d’un fichier de taille |DOC| • Charger DOC, hacher en RAM en n paquets, avec n du même ordre que ||DOC||
• 2×|DOC|×( ⎡log M |DOC|/M⎤ + 1 ) - |DOC|
(car on ne compte pas l’écriture du résultat final) DOC
h=1
h=2

– Avec M = √ |DOC|

Page D

Page 2

Page 1
h


IN 1 M-2 pages
• 2×|DOC|×( ⎡log √ |DOC| |DOC|/ √ |DOC| ⎤ + 1 ) - |DOC| = 2×|DOC|×(1+1)-|DOC| …

= 3 × |DOC| RAM h = ||DOC||

– (idem pour |VIS|)


– Phase de test (probe)
• Parcourir VIS, pour chaque tuple tester la table de hachage et produire les résultats
• Si M est trop petite  Trop coûteux ! VIS IN 2
DOC
DOC ∞ VIS

Page D+V
IN 3

OUT M

Page 2

Page 1
Page V

Page 2

Page 1
• Si M ≥ √(|DOC|) et √|VIS|)  3 × (|DOC|+|VIS|) I/Os …


h


IN 1

IN M-1
RAM

• Si une relation est déjà triée (ex. DOC, sur id) • Coût
– on économise la phase de tri : ici environ 2 × |DOC| – Hypothèse : M ≥ |DOC| (NB: sinon la relation DOC ne tient pas en mémoire…)
– Le coût est alors : |DOC| + 3 |VIS| I/Os – I/Os = |DOC| + |VIS|
Différence avec la boucle imbriquée ?
29 30
24

Jointure par hachage (Hash Join) Jointure par hachage (Grace Hash Join)
• Principe de l’algorithme : (équi-jointure DOC.id = VIS.docid) • Principe de l’algorithme : (équi-jointure DOC.id = VIS.docid)
– Phase de construction (build)
• Charger DOC, hacher en RAM en n paquets, avec n du même ordre que ||DOC||
– Phase de construction (build) : Hacher DOC et VIS avec h sur disque
• Hachage en n partitions, n est calculé de façon à ce que |partition| < M
h=1
DOC h=2
IN 2 Page 1 Page 2

Page D

Page 1
Page 2
Page D

Page 2

Page 1

DOC IN 3 Page 3 Page 4 Page 5


IN 1
h

IN 1 M-2 pages h …

RAM IN M Page … Page D
VIS
RAM h = ||DOC|| Page 1 Page 2 Page 3

Page V

Page 2

Page 1
h=1
h


h=n Page … Page V
RAM
– Phase de test (probe)
• Parcourir VIS, pour chaque tuple tester la table de hachage et produire les résultats
– Phase de test (probe) : Joindre DOC et VIS par partition
DOC
VIS IN 2 DOC ∞ VIS • Les tuples d’1 partition de DOC matchent uniquement avec 1 partition de VIS
• Charger 1 partition de DOC (M pages), et le hacher avec h’ ≠ h
Page D+V

IN 3
OUT M

Page 2

Page 1
Page V

Page 2

Page 1


h

IN 1
… • Parcourir la partition correspondante de VIS en appliquant h’
IN M-1
RAM
IN 2
Page 1 Page 2 h’ IN 3
• Coût
h’=2
Page 3 Page 4 Page 5

IN M-1 DOC ∞ VIS
– Hypothèse : M ≥ |DOC| (NB: sinon la relation DOC ne tient pas en mémoire…) Page … Page D

Page D+V
h’

Page 2

Page 1
– I/Os = |DOC| + |VIS| Page 1 Page 2 Page 3 OUT


IN 1
La fonction de hachage permet de chercher
Différence avec la boucle imbriquée ? rapidement les tuples qui joignent en mémoire… Page … Page V RAM
31 32
Coût de la jointure (Grace Hash Join) Coût de la jointure (Grace Hash Join)
• Hypothèse : M ≥ √ (|DOC|) et √ |VIS|, explication… • Hypothèse : M ≥ √ (|DOC|) et √ |VIS|, explication…
– Nombre de partitions n ≤ M-1 Pourquoi ? – Nombre de partitions n ≤ M-1 Pourquoi ? 1 page par partition en RAM…

– Taille de la partition la plus grosse < M-2 Pourquoi ? – Taille de la partition la plus grosse < M-2 Pourquoi ? Doit tenir en RAM lors du probe…
– Avec des partitions de taille similaire, et en maximisant n – Avec des partitions de taille similaire, et en maximisant n
• on a : n = M-1 et |DOC|/(M-1) < M-2  M ≥ √ (|DOC|) • on a : n = M-1 et |DOC|/(M-1) < M-2  M ≥ √ (|DOC|)
– NB: si h réparti mal les données, des partitions peuvent être trop grosses – NB: si h réparti mal les données, des partitions peuvent être trop grosses
• Appliquer récursivement l’algo. aux partitions trop grosses de DOC et VIS • Appliquer récursivement l’algo. aux partitions trop grosses de DOC et VIS

• Coût en I/Os • Coût en I/Os


– Avec M ≥ √ (|DOC|) et √ |VIS| – Avec M ≥ √ (|DOC|) et √ |VIS|
• Phase de construction (build) = lecture + écriture des 2 relations • Phase de construction (build) = lecture + écriture des 2 relations
• Phase de test (probe) = lecture des 2 relations • Phase de test (probe) = lecture des 2 relations
– Coût total  3 × (|DOC| + |VIS|) I/Os – Coût total  3 × (|DOC| + |VIS|) I/Os
– NB: condition mémoire et coût comme Jointure Tri Fusion (Sort Merge Join)… – NB: condition mémoire et coût comme Jointure Tri Fusion (Sort Merge Join)…

• Comparaison Tri-Fusion vs. Grace Hash Join • Comparaison Tri-Fusion vs. Grace Hash Join
– Avec assez de mémoire RAM, les deux algorithmes ont le même coût – Avec assez de mémoire RAM, les deux algorithmes ont le même coût
• M ≥ √ (|DOC|) et √ |VIS| • M ≥ √ (|DOC|) et √ |VIS|
– Par hachage : plus facile à paralléliser – Par hachage : plus facile à paralléliser
– Par Tri Fusion : moins sensible à la distribution; résultat trié – Par Tri Fusion : moins sensible à la distribution; résultat trié

33 34
25

Jointure par hachage (Hybrid Hash Join) Jointure par hachage (Hybrid Hash Join)
• L’approche Grace Hash Join est pessimiste • Principe de l’algorithme (suite)
– On suppose par avance que ni DOC ni VIS ne tiennent en mémoire – 2ème phase : débordement mémoire
• L’approche Hybrid Hash Join est optimiste DOC h

– On suppose par avance qu’une relation (DOC) tient en mémoire Page 1


Page 2
h=1
IN 2
h=2
IN … IN …
h=n

IN …

(comme dans le Hash Join)


IN 1 IN 3
……
IN
… …
… IN … …
Page D
IN … IN M

• Principe de l’algorithme : (équi-jointure DOC.id = VIS.docid) RAM

– En 4 phases
1) hachage, 2) débordement, 3) test en mémoire, 4) test en débordement IN 2

IN 3
IN …


… IN …

– 1ère phase : hachage de DOC en n partitions (comme pour le Hash Join)


IN …

DOC
Page 1
h
h=1 h=2 h=n
– Des partitions sont choisies pour être reportées sur disque
IN 2 IN … IN … IN …
Page 2
IN 1 IN 3
……
IN

• Libère de l’espace mémoire

… IN … …
Page D

RAM
IN … IN M
– Le parcours de DOC continue… (jusqu’à la fin de DOC)

35 36
Jointure par hachage (Hybrid Hash Join) Jointure par hachage (Hybrid Hash Join)
• Principe de l’algorithme (suite) • Principe de l’algorithme (suite)
– 3ème phase : lecture de VIS – 4eme phase : jointure des partitions sur disque
– Charger une partition de DOC, la hacher avec h’ ≠ h
DOC VIS
IN 2 IN … IN … IN … h’
DOC ∞ VIS
IN 3
IN…… h=m
… … h=1 h=2 Page 1
… IN … IN …
DOC ∞ VIS IN 2 IN … IN … IN …
IN … IN 1 Page 2
Page 1 IN 3
……
IN

… IN … …
VIS Page 2
h
RAM IN … IN M
Page 1 …
h=1 h=2 h=n … h’
Page 2
IN … IN …
IN 1 IN 1
… ……
IN OUT Page … Page D+V

Page V IN M
RAM
IN 2 IN … IN … IN …
IN 3
IN……
… …
… IN … IN …

– Application de la fonction de hachage sur les tuples de VIS


IN …

• h correspond à une partition en mémoire, production de résultats – Parcourir la partition correspondante de S


• h correspond à une partition sur disque, écrire la partition sur disque
– Hacher chaque tuple avec h’ et produire les résultat
37
– Réitérer jusqu’à terminer les partition sur disque… 38
26

Coût de la jointure (Hybrid Hash Join) Condition générale de jointure


• Coût I/Os • NB : pour l’instant, equi-jointure mono-attribut…
– Ex. M = |DOC|/n
– Phase 1 : lecture de |DOC| • Equi-jointure multi-attributs
– Jointure par tri fusion ou hachage
– Phase 2 : écriture de |DOC|(n-1)/n sur disque • Prendre en compte la combinaison des colonnes comme clé de jointure
– Phase 3 : lecture de |VIS|, écriture de |VIS|(n-1)/n sur disque – Jointure par boucle
– Phase 4 : lecture de |DOC|(n-1)/n et |VIS|(n-1)/n • Construire un index sur la combinaison des colonnes

– Total = |DOC| + 2|DOC|(n-1)/n + |VIS| + 2|VIS|(n-1)/n


= (|DOC|+|VIS|) x (1 + 2 (n-1)/n) I/Os • Inequi-jointures
– Condition d’inégalité, Ex. R.date > S.date
– Avec n = 2  2 × (|DOC|+|VIS|) I/Os
– Pour la boucle imbriquée, besoin d’un arbre B+ (plaçant !)
• Accéder la relation interne avec l’index sur l’intervalle du tuple externe, le
• Technique implantée dans les SGBD commerciaux nombre de résultat est très grand
– Oracle, MS SQL Server, IBM DB2, … – Les algorithmes de tri et hachage ne sont pas applicable…
– La boucle imbriquée est le meilleur candidat pour ce type de jointure
39 40
Autres opérations : groupement et agrégation Autres opérations : ensemblistes
• Ex. de requête SELECT date, SUM(quantité_prescrite) • Union (∪), intersection (∩) et différence (⎯)
FROM VIS
GROUP BY date;!
• Algorithme : Basées sur du tri fusion ou du hachage
• Le groupement peut être implantée ≈ l’élimination des doublons
(cf. projection avec clause DISTINCT) • Ex. d’opération ensemblistes basées sur du hachage
– Partitionner les DOC et VIS avec une fonction de hachage h
• Tri ou hachage peuvent être utilisés
– Pour grouper les tuples partageant une même clé de groupement – Pour chaque partition Pi
(ici, la date) • Hacher avec h’ ≠ h hacher en mémoire DOC.Pi
– Pour agréger les tuples (calculer la somme) de chaque groupe
– Optimisation possible de l’algorithme de tri • Parcours de chaque VIS.Pi, pour chaque tuple tVIS.Pi appliquer h’
• Phases de tri et de fusion : agréger (partiel) les tuples de même clé • r∪s
– Réduction de la taille des paquets (donc du nombre d’I/Os des passes suivantes…)
• Pour les fonctions count, min, max, sum : seule la valeur de l’agrégat partiel est nécessaire – Ajouter tVIS.Pi à Pi si il n’y est pas déjà
• Pour la fonction avg : garder aussi le nombre de tuples (count) déjà intégrés dans l’agrégat partiel… – A la fin du parcours de VIS.Pi, produire les tuples de la RAM
• Remarques : avec un index • r∩s
– Avec un index (index couvrant) dont la clé contient les attributs de la requête (select&group – Produire tVIS.Pi en résultat s’il est dans DOC.Pi
by, et clause where) on peut répondre avec l’index seul
– Si la clé de groupement est un préfix de la clé de l’index, on retrouve les tuples dans l’ordre
• r ⎯ s
du groupement. – Retirer le tuple de DOC.Pi correspondant à tVIS.Pi s’il existe
– A la fin du parcours de VIS.Pi, produire les tuples de DOC.Pi restant
41 42
27

Autres opérations : Jointure externe (Outer Join) Exécution d’une requête


• Combinaison d’opérateurs physiques
• Définition de la jointure externe (DOC∝VIS) – Ex. Implantation physique de la jointure
π
– DOC∝VIS = DOC∞VIS ∪ DOC ⎯ πDOC(DOC∞VIS) • Deux opérateurs
• La jointure externe (∝) peut être calculée de 2 façons – Build : construction de la table de hachage Probe
– Avec un algorithme de jointure classique – Probe : test avec la table de hachage
• Jointure classique DOC∞VIS
• Suivie du ‘padding’ à null des tuples de DOC non participant • Les opérateurs physique s’interfacent σ Build
– Avec un algorithme de jointure modifié
• Représentation sous forme d’arbre d’opérateurs
• Modification de l’algorithme de jointure par tri fusion Scan Scan
– Pendant la phase de fusion,
DOC VIS
– produire aussitôt tout tuple tDOC qui ne joint pas
(on parcours ces tuples jusqu’à trouver tDOC / tDOC.id≥tVIS.docid) • 2 alternatives d’exécution d’un arbre d’opérateurs
• Modification de l’algorithme de jointure par hachage – Avec matérialisation
– Si VIS est la table sur laquelle on construit la table de hachage • construction du résultat complet des opérateurs dont l’entrée est matérialisée
• Build : construire la table de hachage sur VIS • Du bas : les opérateurs dont les entrées sont les relations de base déjà matérialisées
• Probe : produire tout tuples de tDOC que ne joint pas avec un ‘padding’ à null
• Vers la racine : les opérateurs dont les fils ont déjà matérialisé leur résultat
– Si DOC est la table sur laquelle on construit la table de hachage
• Build : construire la table de hachage sur DOC – En pipeline
• Probe : marquer tous les tuples tDOC qui ont joint avec un tuple tVIS, et les produire à la fin
(avec un ‘padding’ à null) • Chaque opérateur renvoie directement ses résultats à son parent (sans matérialiser)

43 44
Exécution matérialisée Exécution pipeline (1)
• Evaluation complète d’un opérateur à la fois • Plusieurs opérateurs fonctionnent ‘simultanément’
– Chaque opérateur prend en entrée une table – Sans écrire de résultat intermédiaire (se passe directement les tuples
(ou deux pour les opérateurs binaires)
π
résultats)
– Et produit une table en sortie – Ils forment alors une chaîne pipeline π
• Résultats de chaque opérateur matérialisé Probe
• Ex. Dans l’arbre précédent
– Sur disque dans des relations temporaires Probe
σ – 1) Accéder VIS et construire la table de hachage
Age > 32 Build
– 2) Accéder DOC et sélectionner (age > 32) σ
Age > 32 Build

• Ex.  Passer chaque tuple résultat au probe


Scan Scan Scan Scan
– Accéder VIS et construire la table de hachage
DOC VIS DOC VIS
– Accéder DOC et sélectionner (ici age>32)
 Ecrire le résultat sur disque Lire les DOC sélectionnés et tester avec la table de hachage
– Lire les DOC sélectionnés et tester avec la table de hachage  Passer chaque tuple résultat à la projection
 Ecrire les résultats de la jointure sur disque Lire le résultat de la jointure et effectuer les projections
– Lire le résultat de la jointure et effecteur les projections
• Efficacité du pipeline
• L’exécution matérialisée est toujours applicable mais coûteuse
– Moins de résultats temporaires  moins d’I/Os
– Ecritures intermédiaires  ajoute l’écriture du résultat aux coûts précédents
– Les opérateurs produisent des tuples dès qu’ils en consomment
• Eviter d’écrire les résultats (autant que possible)  Exécution pipeline… • MAIS : pas toujours possible…
45 46
28

Exécution pipeline (2) Variante pipeline du Hybrid Hash Join


• Toutes les opérateurs ne peuvent former une chaîne pipeline… • Hybrid hash join – version bloquante
• Dépend de la nature de l’opérateur (build vs. sélection) – Lire tout DOC DOC
Table de
hachage
• Partitionner, DOC.P0 reste en mémoire
• Dépend de son implémentation physique – Lire VIS VIS Test
– Certains algorithmes sont bloquants • Produire résultats (DOC.P0∞VIS.P0)
– i.e., ne peuvent produire des résultats dès qu’ils reçoivent des tuples en entrée • Ecrire VIS.Pi>0 sur disque Bloquant
– Ex. Jointure par tri fusion, jointure par hachage (Hybrid Hash Join) – Lire les partitions DOC.Pi>0 et VIS.Pi>0
• Produire résultats (DOC.Pi>0∞VIS.Pi>0)
• Il faut créer des versions (‘presque’) pipeline des algorithmes bloquants  la production commence seulement après le hachage de DOC
– i.e., capable de générer des résultats quand des tuples sont fournis en entrée
– Ex. algorithme de jointure pipeline: variante pipeline du Hybrid Hash Join
(détail après…) • Hybrid hash join – variante pipeline Table de
DOC
– DOC et VIS traitées simultanément hachage
Table de
DOC
hachage • P0 en mémoire, Pi>0 sur disque
Table de Test
DOC hachage
• Quand un nouveau tuple tDOC.P0 arrive
Test – Joindre avec les tuples existant de VIS.P0 VIS
Table de
hachage
VIS Test
Table de
– Produire les résultats
VIS
hachage – Stocker tDOC.P0 dans DOC.P0 Pipeline
Bloquant • Même chose avec les nouveaux tuples tVIS.P0…
Pipeline
• Types d’exécution pipeline : orientée production ou consommation
• Types d’exécution pipeline : orientée production ou consommation
47 48
Modèles d’exécution pipeline Implantation sous forme d’itérateur

• Modèle orienté consommation (pull ou lazy)


– Un opérateur demande à son fils le tuple suivant quand il en a besoin • Le modèle iterateur
– Entre les appels, chaque opérateur maintient son ‘contexte’ – Interface uniforme et générale pour tous les operateurs
• Nécessaire pour savoir quel tuple renvoyer ensuite physiques
– Ex. le modèle itérateur… (voir la suite)
– Chaque opérateur est décomposé en trois méthodes
• Open() alloue la mémoire, effectue l’initialisation
• Modèle orienté production (push ou eager) • Next() renvoie un tuple résultat (ou ‘end of file’ eof)
– Un opérateur produit des tuples et les envoie aussitôt à son parent • Close() libère la mémoire et rend la main
– Des buffers sont maintenus entre les opérateurs
• Les enfants placent des tuples dans le buffer
• Le parent retire des tuples du buffer • Flot de données (tuples) : itérateurs feuilles  racine
– Si le buffer est plein, les enfants attendent
• le parent doit consommer des tuples pour libérer de l’espace
• Flot de controle : itérateur racine  feuilles

49 50
29

Ex. d’itérateur : le Hash Join Execution d’un arbre d’itérateurs (1)


probe build project project.open(){
R h(R.a) R hash table output R S
probe2.open{
build scan buffer build2.open() { // hach table de T
scanT.open();
scan S S probe2 t = scanR.next()
h(S.b) probe while (! eof) {
R Memory t = scanT.next();
build2 insert t in table }
• probe.open() { • build.open() { scanT.close();
build.open(); scanR.open(); probe1 }
scanS.open() } t = scanR.next() scanT build2.close();
while (t != eof) { T probe1.open() {
• probe.next() {
t = scanS.next() put t in table; build1 build1.open() {
scanS // hash table de R
probe the hash table with t; t = scanR.next() }
return one result tuple } scanR.close() } S ...}
build1.close();
• probe.close() { • build.close() { scanR
R scanS.open();
build.close() de-allocate table } }
scanS.close() } }
51 52
Execution d’un arbre d’itérateurs (2) Execution d’un arbre d’itérateurs (3)
project.next(){ • Relation producteur-consommateur project
project
probe2.next { – Des données sont matérialisées
probe1.next() { – Des données passent en pipeline probe2
s = scanS.next(); build2
probe1
probe2 test table de R avec s; • Les chaines pipeline sont délimitées
return tuple rs; – Opérateurs bloquants scan build1 scan
} – Ex. build, mat, sort, ... S T
build2 test table de T avec rs; scan chaineT
 Constrainte d’ordonnancement chaineS R
return tuple rst;
probe1 (ordonancement partiel des chaines pipelines)
} chaineR
scanT rstp=projection(rst);
T • NB : L’implantation des opérateurs physiques détermine complètement
build1 return rstp;
l’ordre d’execution du plan (l’ordonancement)
scanS }
S
scanR • Pb : allouer la mémoire aux opérateurs qui s’exécutent en même temps
R – Ex. ChaineS = scanS 10%, probe1 45%, probe2 45%, project 10%

53 54
30

Problème de la répartition de la mémoire Répartition de la mémoire (Oracle 8i)


• Comment répartir la mémoire ?
– Dans un opérateur, entre les opérateurs ?
– Entre les requêtes ?

Query 2
– Une moyenne ?
– Max au Min ?

Op. 2 Op. 3
• SORT_AREA_SIZE

• Quand répartir la mémoire ? • HASH_AREA_SIZE

• Tuning !
Query 1
– Au moment de la compilation de la requête ?
– Au démarrage de l’exécution ?

Disponible

Nécessaire
Op. 1
– Pendant l’exécution ?

• Problème complexe !!! Entre les Entre les Dans un


requêtes opérateurs opérateur
• Et très Important...
55 56
Adapter les opérateurs à la mémoire ! Conclusion (1)
• Le choix de la bonne implémentation d’un opérateur
relationnel (select, project, join, union, etc.) dépend • Une vertu des bases de données
– Les requêtes sont composées de quelques opérateurs de base
– de la requête qui le contient
– L’implantation de ces opérateurs peut (et doit) être finement réglée
– des caractéristiques des inputs
– de ses paramètres (prédicat de jointure, de sélection, etc.) • Beaucoup d’alternatives dans l’implantation des opérateurs
– des caractéristiques des données – Et pas de technique universelle ni supérieure pour la plupart d’entre eux
– des structures d’indexation existantes
– et beaucoup de la quantité de mémoire disponible • Différentes alternatives pour chaque opération d’une requête
– Doivent être considérées
– Et la meilleure doit être choisie sur la base de statistiques,
• Quels sont les différents choix ?  Objet de ce cours d’heuristiques, etc.
• Comment choisir ?  Problématique d’optimisation – C’est la charge de l’optimiseur de requêtes…

57 58
31

Conclusion (2)
• Sans considérer les différents algorithmes ni la consommation mémoire
– Jointure de 5 relations (avec produits cartésiens)
• 120 arbres linéaires différents
• 1620 arbres bushy différents
Probe 3
– Jointure de 10 relations (idem) Im
po
Im
po

• 3 628 800 arbres linéaires différents Build 3


Probe 2
Im

• 17 643 225 600 arbres bushy différents !!!


Im
I I po
Im po
m m
p p po
o
s
o
s Im Build 2 Scan U
s
i
s
i
po
ssi Probe 1 Im

Les Opérateurs
b b po
l l Im
I

Scan T
e e po
m

R S T U Build 1 Scan S
Im
po

Arbre linéaire gauche (left deep tree) Arbre Bushy (Bushy tree) Scan R

I
Probe 3
Impo Impos
sible
Probe 3 Arbre linéaire droit (right deep tree)
Build3 ScanU
Im
Im po
po ssi

U Impos ssi

Probe 2 Probe 2 Im
po
Impos
sible
d'affic Impo
Build 3 Im
ssi

her Impos po

T
l'imag Im

Build2
Im ssi
e. po
po

ScanT
I

U
Votre ssi

Probe 1
ssi
ordin
ateur Impos Imp
manq
ue Im
po
sible

Probe 1 Scan U Build 2 I Im


ossi
ble
d'a
ssi

R S m po ffic
Impo
Impos
Im
po
p ssi
T her
l'im

Build1
age
ssi

ScanS Build 1 .

ScanT Scan R
S
Impos
Im
po R
ScanR ssi

Scan S
Slides empruntés à Pascale Borlat Salamet – Oracle France
 Complexité de la phase d’optimisation ! (objet du prochain cours…)
59 60
61 62
32

63 64
Le Star Join Index d’Oracle

65 66
33

67 68
Objectif du module ‘gestion de mémoire’

• Rendre les pages de la BD accessibles en mémoire


– Mapping des pages BD en mémoire
– Garantie l’adresse de la page pendant un laps de temps
Aparté sur la gestion – Garantie la cohérence de plusieurs copies de pages
mémoire…
• Optimiser les performances
– Cache des pages
– Coûts réseau (cohérence)
– Forte connexion avec le gestionnaire de verrous et de
journalisation

69 70
34

Occupation mémoire sur un serveur BD Gestion par l’OS vs. par le SGBD
• Sur un serveur SGBD, la mémoire est occupée par : • L’OS considère toutes les pages comme équivalentes
– le logiciel
– des pages BD – Pas de connexion avec le verouillage/journalisation
– des pages temporaires – Application d’heuristiques (LRU)
– des structures de données du SGBD (globales au SGBD) – Utilisation d’un disque de swap
– des structures liées aux transactions
• Le SGBD a une connaissance du contenu des pages
• Si le serveur n’est pas dédié, on a aussi – Il peut utiliser les infos fournies aux modules de gestion de
– des données, programmes, etc... verrous et de journaux
– Il contrôle complètement la mémoire disponible
• Intérêt d’un serveur dédié ? Influence sur les algorithmes utilisés
– Il peut contrôler le swap
Influence sur la journalisation
– Les caches peuvent être optimisés suivant d’autres critères
71 72
BD: Partie chaude / froide / active Ordres de grandeur
Taille de mémoire vive (RAM) disponible pour le SGBD
• Taille de la base de données
– Place sur le disque du fichier BD 1 To BD mémoire ... ???
• Taille de la base de données active
– Taille des pages accédées à un instant donné par toutes les transactions 100 Go BD hautes performances
• Taille de la base de données chaude (80% des accès)
– Taille des pages accédées très fréquemment par toutes les transactions 10 Go BD production (banque, etc..)
• Taille de la base de données froide (20% des accès)
– Taille des pages accédées peu fréquemment par toutes les transactions 1 Go BD PME
• La modélisation des ‘workloads’
– est complexe... 0,1 Go BD personnelles (PC...)
– et a une grande influence sur les algorithmes à utiliser…

1-10 Ko Pico-BD (carte à puce)


73 74
35

Mémoire Virtuelle Option 1 : Single Level Storage


Impossible d'afficher l'image. Votre ordinateur manque peut-être de mémoire pour ouvrir Impossible d'afficher l'image. Votre ordinateur manque peut-être de mémoire pour ouvrir l'image ou l'image
l'image ou l'image est endommagée. Redémarrez l'ordinateur, puis ouvrez à nouveau le est endommagée. Redémarrez l'ordinateur, puis ouvrez à nouveau le fichier. Si le x rouge est toujours affiché,
fichier. Si le x rouge est toujours affiché, vous devrez peut-être supprimer l'image avant de la

Mémoire Physique
vous devrez peut-être supprimer l'image avant de la réinsérer.
réinsérer.

Impossible d'afficher l'image. Votre ordinateur manque Mémoire Physique Impossible d'afficher l'image. Votre ordinateur manque

Systèmes 32 bits
peut-être de mémoire pour ouvrir l'image ou l'image est peut-être de mémoire pour ouvrir l'image ou l'image est
Impossible d'afficher l'image. Votre ordinateur manque peut-être de mémoire pour ouvrir l'image ou l'image est endommagée. endommagée. Redémarrez l'ordinateur, puis ouvrez à endommagée. Redémarrez l'ordinateur, puis ouvrez à
Redémarrez l'ordinateur, puis ouvrez à nouveau le fichier. Si le x rouge est toujours affiché, vous devrez peut-être supprimer nouveau le fichier. Si le x rouge est toujours affiché, vous nouveau le fichier. Si le x rouge est toujours affiché, vous
Impossible d'afficher l'image. Votre ordinateur l'image avant de la réinsérer. devrez peut-être supprimer l'image avant de la réinsérer. devrez peut-être supprimer l'image avant de la réinsérer.
Impossible d'afficher l'image. Votre ordinateur manque peut-être de mémoire pour ouvrir
manque peut-être de mémoire pour ouvrir l'image ou l'image est endommagée.
l'image ou l'image est endommagée. Redémarrez l'ordinateur, puis ouvrez à nouveau
Redémarrez l'ordinateur, puis ouvrez à le fichier. Si le x rouge est toujours affiché,

4 Go
nouveau le fichier. Si le x rouge est toujours vous devrez peut-être supprimer l'image avant
affiché, vous devrez peut-être supprimer de la réinsérer.
l'image avant de la réinsérer.
Impossible d'afficher l'image. Votre ordinateur manque peut-être de mémoire pour ouvrir l'image ou l'image
est endommagée. Redémarrez l'ordinateur, puis ouvrez à nouveau le fichier. Si le x rouge est toujours affiché,
vous devrez peut-être supprimer l'image avant de la réinsérer.
Impossible d'afficher l'image. Votre ordinateur manque peut-être
de mémoire pour ouvrir l'image ou l'image est endommagée.

système
Redémarrez l'ordinateur, puis ouvrez à nouveau le fichier. Si le x
rouge est toujours affiché, vous devrez peut-être supprimer
l'image avant de la réinsérer. Impossible d'afficher l'image. Votre ordinateur manque peut-être de mémoire pour ouvrir l'image ou l'image est endommagée.
Impossibl Redémarrez l'ordinateur, puis ouvrez à nouveau le fichier. Si le x rouge est toujours affiché, vous devrez peut-être
supprimer l'image avant de la réinsérer. e

Mémoire Virtuelle
d'afficher
l'image.
Impo
Impossi
ble
Impossible d'afficher l'image. Votre ordinateur d'affiche

Swapping
manque peut-être de mémoire pour ouvrir r
l'image ou l'image est endommagée. l'image.
Redémarrez l'ordinateur, puis ouvrez à

Systèmes 64 bits
nouveau le fichier. Si le x rouge est toujours
affiché, vous devrez peut-être supprimer
l'image avant de la réinsérer.
Impossible d'afficher l'image. Votre ordinateur
manque peut-être de mémoire pour ouvrir l'image
ou l'image est
Impossible endommagée.
d'afficher l'image. Redémarrez
Votre ordinateur

Zone de swap
manque peut-être de mémoire pour ouvrir l'image

18 exa-octets
ou l'image est endommagée. Redémarrez
l'ordinateur, puis ouvrez à nouveau le fichier. Si le x
rouge est toujours affiché, vous devrez peut-être Impossible d'afficher l'image. Votre ordinateur manque peut-être de mémoire pour ouvrir l'image ou l'image est endommagée. Redémarrez l'ordinateur, puis ouvrez à nouveau le fichier. Si le x
Impossible d'afficher l'image. Votre ordinateur
supprimer
Impossible l'image avant
d'afficher de la Votre
l'image. réinsérer.
ordinateur rouge est toujours affiché, vous devrez peut-être supprimer l'image avant de la réinsérer.

Fichier BD
manque peut-être de mémoire pour ouvrir l'image
ou l'image est endommagée. Redémarrez

Impossible d'afficher l'image. Votre ordinateur manque peut-être de mémoire pour ouvrir l'image ou l'image est endommagée. Redémarrez l'ordinateur, puis ouvrez à nouveau le fichier. Si le x rouge est
Impos
(18 millions de
Tera-octets)
toujours affiché, vous devrez peut-être supprimer l'image avant de la réinsérer.

Mémoire Virtuelle
sible
d'affic

I
Impo
ssibl
e

• Le système est responsable du


d'affi

– ‘mapping’ du fichier BD sur la mémoire virtuelle


– ‘mapping’ de la mémoire virtuelle sur la mémoire physique
Impossible
Impossible Impossible Impossible

– ‘swapping’
d'afficher
d'afficher d'afficher d'afficher

P3
l'image. Votre

P1 P2 P4
l'image. Votre l'image. Votre ordinateur l'image. Votre
ordinateur ordinateur manque peut- ordinateur
manque peut- manque peut- peut-être
être de de manque peut-
peut-être
être de de peut-être
être de de mémoire pour peut-être
être de de
mémoire pour mémoire pour ouvrir l'image mémoire pour
ouvrir l'image ouvrir l'image ou l'image est ouvrir l'image
ou l'image est ou l'image est ou l'image est

75 76
Option 2 : Mapping OS / Swapping BD Option 3: Mapping BD / Swapping BD
Impossible d'afficher l'image. Votre ordinateur manque peut-être de mémoire pour
Impossible d'afficher l'image. Votre ordinateur manque peut-être de mémoire pour ouvrir l'image ouvrir l'image ou l'image est endommagée. Redémarrez l'ordinateur, puis ouvrez à
ou l'image est endommagée. Redémarrez l'ordinateur, puis ouvrez à nouveau le fichier. Si le x nouveau le fichier. Si le x rouge est toujours affiché, vous devrez peut-être supprimer
rouge est toujours affiché, vous devrez peut-être supprimer l'image avant de la réinsérer.

Physical memory
Impossible d'afficher l'image. Votre ordinateur manque peut-être de mémoire pour ouvrir l'image ou l'image est l'image avant de la réinsérer.

Mémoire Physique Swapping


endommagée. Redémarrez l'ordinateur, puis ouvrez à nouveau le fichier. Si le x rouge est toujours affiché, vous devrez
peut-être supprimer l'image avant de la réinsérer.

Impossible d'afficher l'image. Votre ordinateur Impossible d'afficher l'image. Votre ordinateur
manque peut-être de mémoire pour ouvrir l'image manque peut-être de mémoire pour ouvrir l'image
ou l'image est endommagée. Redémarrez ou l'image est endommagée. Redémarrez
l'ordinateur, puis ouvrez à nouveau le fichier. Si le l'ordinateur, puis ouvrez à nouveau le fichier. Si le
x rouge est toujours affiché, vous devrez peut- x rouge est toujours affiché, vous devrez peut-
être supprimer l'image avant de la réinsérer. être supprimer l'image avant de la réinsérer.

Impossible d'afficher l'image. Votre ordinateur manque peut-être de mémoire pour ouvrir
l'image ou l'image est endommagée. Redémarrez l'ordinateur, puis ouvrez à nouveau le fichier.
Si le x rouge est toujours affiché, vous devrez peut-être supprimer l'image avant de la réinsérer.
réinsérer. Impossible d'afficher l'image. Votre ordinateur manque peut-être de
mémoire pour ouvrir l'image ou l'image est endommagée. Redémarrez
l'ordinateur, puis ouvrez à nouveau le fichier. Si le x rouge est toujours

SGBD
Impossible d'afficher l'image. Votre ordinateur manque peut-être de mémoire pour ouvrir l'image ou l'image est endommagée. Redémarrez l'ordinateur, puis ouvrez à nouveau le fichier. Si le x rouge est toujours affiché,
Imposs affiché, vous devrez peut-être supprimer l'image avant de la réinsérer.
vous devrez peut-être supprimer l'image avant de la réinsérer. ible

Mémoire Virtuelle
d'affich
er Impossible d'afficher l'image. Votre ordinateur manque peut-être de mémoire pour Impossible d'afficher l'image. Votre ordinateur manque peut-être de mémoire pour ouvrir l'image ou l'image est endommagée. Redémarrez l'ordinateur, puis
Im ouvrir l'image ou l'image est endommagée. Redémarrez l'ordinateur, puis ouvrez à ouvrez à nouveau le fichier. Si le x rouge est toujours affiché, vous devrez peut-être supprimer l'image avant de la réinsérer.

Working Memory
nouveau le fichier. Si le x rouge est toujours affiché, vous devrez peut-être supprimer
Impos
l'image avant de la réinsérer.
sible
d'affic
her
l'imag

Impossible d'afficher l'image. Votre ordinateur manque

Virtual Memory
peut-être de mémoire pour ouvrir l'image ou l'image
est endommagée.
Impossible Redémarrez
d'afficher l'ordinateur,
l'image. Votre puis
ordinateur ouvrez
manque
Impossible d'afficher l'image. Votre ordinateur manque peut-être de mémoire pour ouvrir l'image ou l'image est endommagée. Redémarrez l'ordinateur, puis ouvrez à peut-être de mémoire pour ouvrir l'image ou l'image

Zone de swap
nouveau le fichier. Si le x rouge est toujours affiché, vous devrez peut-être supprimer l'image avant de la réinsérer. est endommagée. Redémarrez l'ordinateur, puis

Fichier BD
ouvrez à nouveau le fichier. Si le x rouge est toujours
affiché, vous devrez peut-être supprimer l'image avant
Impossible
de d'afficher l'image. Votre ordinateur
la réinsérer.
Impossible d'afficher l'image. Votre ordinateur manque
peut-être de mémoire pour ouvrir l'image ou l'image
est endommagée. Redémarrez l'ordinateur, puis ouvrez

Memory Cache
Management Operating system
• Le système est responsable du
Mapping Swapping Swapping
– ‘mapping’ du fichier BD sur la mémoire virtuelle Impossible d'afficher l'image. Votre ordinateur manque peut-
Impossible d'afficher l'image. Votre ordinateur manque peut- être de mémoire pour ouvrir l'image ou l'image est
Impossible d'afficher l'image. Votre ordinateur manque peut-

– ‘mapping’ de la mémoire virtuelle sur la mémoire physique


être de mémoire pour ouvrir l'image ou l'image est endommagée. Redémarrez l'ordinateur, puis ouvrez à nouveau
être de mémoire pour ouvrir l'image ou l'image est endommagée. Redémarrez l'ordinateur, puis ouvrez à nouveau
endommagée. Redémarrez l'ordinateur, puis ouvrez à nouveau Impossible
le fichier. Sid'afficher
le x rougel'image. Votre affiché,
est toujours ordinateur manque
vous devrezpeut-
peut-
le fichier. Sid'afficher
Impossible le x rouge est toujours
l'image. Votre affiché, vous
ordinateur devrezpeut-
manque peut- être de mémoire pour ouvrir l'image ou l'image est
le fichier. Sid'afficher
Impossible le x rouge est toujours
l'image. Votre affiché, vous
ordinateur devrezpeut-
manque peut-
être de mémoire pour ouvrir l'image ou l'image est endommagée. Redémarrez l'ordinateur, puis ouvrez à nouveau
être de mémoire pour ouvrir l'image ou l'image est

Swap BD
endommagée. Redémarrez l'ordinateur, puis ouvrez à nouveau le fichier. Si le x rouge est toujours affiché, vous devrez peut-

Swapping disk
endommagée. Redémarrez l'ordinateur, puis ouvrez à nouveau le fichier. Si le x rouge est toujours affiché, vous devrez peut- être supprimer l'image avant de la réinsérer.
le fichier. Si le x rouge est toujours affiché, vous devrez peut-

DB Disk
être supprimer l'image avant de la réinsérer.
être supprimer l'image avant de la réinsérer.
Impossible d'afficher l'image. Votre ordinateur manque peut-
Impossible d'afficher l'image. Votre ordinateur manque peut-

– Il peut déléguer une partie des fonctions (external pager)


Impossible d'afficher l'image. Votre ordinateur manque peut- être de mémoire
Impossible pour
d'afficher ouvrir Votre
l'image. l'image ou l'image
ordinateur est
manque peut-
être de mémoire
Impossible pour
d'afficher ouvrir l'image
l'image. ou l'imagemanque
Votre ordinateur est peut-
être de mémoire
Impossible pour
d'afficher ouvrir l'image
l'image. ou l'imagemanque
Votre ordinateur est peut- être de mémoire pour ouvrir l'image ou l'image est
être de mémoire pour ouvrir l'image ou l'image est endommagée. Redémarrez l'ordinateur, puis ouvrez à nouveau
être de mémoire pour ouvrir l'image ou l'image est endommagée. Redémarrez l'ordinateur, puis ouvrez à nouveau
endommagée. Redémarrez l'ordinateur, puis ouvrez à nouveau le fichier. Si le x rouge est toujours affiché, vous devrez peut-
le fichier. Si le x rouge est toujours affiché, vous devrez peut-
le fichier. Si le x rouge est toujours affiché, vous devrez peut-

77 78
36

Option 4: Mapping BD / Swapping OS Mapping BD


Impossible d'afficher l'image. Votre ordinateur manque peut-être de mémoire pour ouvrir l'image ou l'image
est endommagée. Redémarrez l'ordinateur, puis ouvrez à nouveau le fichier. Si le x rouge est toujours
affiché, vous devrez peut-être supprimer l'image avant de la réinsérer.
Impossible

Mémoire Physique
d'afficher
l'image. Votre
ordinateur
manque peut-
être de mémoire
pour ouvrir
Impossible
l'image ou
l'image est
Impossible d'afficher l'image. Votre ordinateur manque peut-être de mémoire pour ouvrir endommagée.
Impossible d'afficher l'image. Votre ordinateur manque Impossible d'afficher l'image. Votre ordinateur manque l'image ou l'image est endommagée. Redémarrez l'ordinateur, puis ouvrez à nouveau le Redémarrez
peut-être de mémoire pour ouvrir l'image ou l'image est peut-être de mémoire pour ouvrir l'image ou l'image est fichier. Si le x rouge est toujours affiché, vous devrez peut-être supprimer l'image avant de la l'ordinateur,
endommagée. Redémarrez l'ordinateur, puis ouvrez à endommagée. Redémarrez l'ordinateur, puis ouvrez à réinsérer. puis ouvrez à
nouveau le fichier. Si le x rouge est toujours affiché, vous nouveau le fichier. Si le x rouge est toujours affiché, vous nouveau le
devrez peut-être supprimer l'image avant de la réinsérer. devrez peut-être supprimer l'image avant de la réinsérer. Impossible fichier. Si le x
Impossible
d'afficher l'image. rouge est
toujours affiché,

Page Page
Impossible d'afficher l'image. Votre ordinateur Impossible d'afficher l'image. Votre ordinateur
Impossible d'afficher l'image. Votre ordinateur manque peut-être de mémoire pour ouvrir vous devrez
Impossible manque peut-être de mémoire pour ouvrir manque peut-être de mémoire pour ouvrirl'image ou l'image est endommagée. Redémarrez l'ordinateur, puis ouvrez à nouveau le peut-être

M em o ry
d'afficher l'image. l'image ou l'image est endommagée. Redémarrez l'image ou l'image est endommagée. Redémarrez
fichier. Si le x rouge est toujours affiché, vous devrez peut-être supprimer l'image avant de la supprimer
l'ordinateur, puis ouvrez à nouveau le fichier. Si l'ordinateur, puis ouvrez à nouveau le fichier.
réinsérer.
Si le l'image avant de
le x rouge est toujours affiché, vous devrez x rouge est toujours affiché, vous devrez peut- la réinsérer.

descriptor descriptor
Impossible
peut-être supprimer l'image avant de la être supprimer l'image avant de la réinsérer.
d'afficher l'image.
réinsérer.

D isk ref eren ces


Impossible
d'afficher l'image.

Impossible d'afficher l'image. Votre ordinateur manque peut-être de mémoire pour ouvrir l'image ou l'image est endommagée.
Impossibl Redémarrez l'ordinateur, puis ouvrez à nouveau le fichier. Si le x rouge est toujours affiché, vous devrez peut-être Impossible Impossible d'afficher l'image. Votre ordinateur manque peut-être de mémoire pourI
supprimer l'image avant de la réinsérer. e d'afficher l'image. ouvrir l'image ou l'image est endommagée. Redémarrez l'ordinateur, puis ouvrez àm

Mémoire Virtuelle
d'afficher nouveau le fichier. Si le x rouge est toujours affiché, vous devrez peut-être p
l'image. Impossible supprimer l'image avant de la réinsérer. o
Votre d'afficher l'image.
Imp

Impossi Im Impossible
ble po d'afficher l'image.
d'affiche ssi Impossible I
r d'afficher m
Impossible p
l'image. l'image.
d'afficher l'image. o
Votre
ordinateur s
Impossible manque s

V irtu a l
d'afficher l'image. peut-être de

Impossible

Page
d'afficher l'image. Impossible d'afficher l'image. Votre ordinateur
manque peut-être de mémoire pour ouvrir
l'image ou l'image est endommagée. Redémarrez
Impossible l'ordinateur, puis ouvrez à nouveau le fichier. Si
d'afficher l'image. le x rouge est toujours affiché, vous devrez

descriptor
peut-être supprimer l'image avant de la
réinsérer.

Memory Cache
Impossible
d'afficher l'image.

système
Impossible
d'afficher l'image.

Manager
Impossible d'afficher l'image. Votre ordinateur manque peut-être de
mémoire pour ouvrir l'image ou l'image est endommagée. Redémarrez
l'ordinateur, puis ouvrez à nouveau le fichier. Si le x rouge est toujours
affiché, vous devrez peut-être supprimer l'image avant de la réinsérer.

Impossible

Hash Table
Mapping Swapping
Impossible
d'afficher
l'image. Votre
ordinateur
manque peut-
être de
mémoire pour
ouvrir l'image
ou l'image est
Impossible d'afficher l'image. Votre ordinateur manque peut-être de mémoire endommagée.
Impossible d'afficher l'image. Votre ordinateur manque peut-être de mémoire pour ouvrir l'image ou l'image est endommagée. Redémarrez l'ordinateur, puis Redémarrez
pour ouvrir l'image ou l'image est endommagée. Redémarrez l'ordinateur, puis ouvrez à nouveau le fichier. Si le x rouge est toujours affiché, vous devrez peut- l'ordinateur, I
ouvrez à nouveau le fichier. Si le x rouge est toujours affiché, vous devrez peut- Impossible
être d'afficher
supprimer l'image.
l'image Votre
avant de ordinateur manque peut-être de mémoire
la réinsérer. m
être supprimer
Impossible l'image
d'afficher avant de
l'image. la réinsérer.
Votre ordinateur manque peut-être de mémoire pour ouvrir l'image ou l'image est endommagée. Redémarrez l'ordinateur, puis p
pour ouvrir l'image ou l'image est endommagée. Redémarrez l'ordinateur, puis ouvrez à nouveau le fichier. Si le x rouge est toujours affiché, vous devrez peut- o
ouvrez à nouveau le fichier. Si le x rouge est toujours affiché, vous devrez peut- être supprimer l'image avant de la réinsérer. s

Zone de swap
être supprimer l'image avant de la réinsérer.

Impossible
Zone BD
Impossible d'afficher l'image. Votre ordinateur manque peut-être de mémoire
pour ouvrir l'image ou l'image est endommagée. Redémarrez l'ordinateur,
d'afficher
puis ouvrez l'image.
à nouveau VotreSiordinateur
le fichier. le x rougemanque peut-être
est toujours de vous
affiché, mémoire
pour ouvrir l'image ou l'image est endommagée. Redémarrez l'ordinateur, puis
ouvrez à nouveau le fichier. Si le x rouge est toujours affiché, vous devrez peut-
être supprimer l'image avant de la réinsérer.
Impossible d'afficher l'image. Votre ordinateur manque peut-être de mémoire
pour ouvrird'afficher
Impossible
ouvrez
pour ouvrir
l'image ou
à nouveau
l'imagele
l'imageVotre
l'image.
oufichier.
est endommagée.
l'imageSiest
Redémarrez
ordinateur manque
le xendommagée.
rouge est toujours
l'ordinateur,
peut-être de mémoire
affiché,l'ordinateur,
Redémarrez
puis
vous devrezpuis
ouvrez à nouveau le fichier. Si le x rouge est toujours affiché, vous devrez peut-
être supprimer l'image avant de la réinsérer.
MemAdress

79 80
Problème de la répartition de la mémoire Répartition de la mémoire (Oracle 8i)
• Comment répartir la mémoire ?
– Dans un opérateur, entre les opérateurs ?
– Entre les requêtes ?

Query 2
– Une moyenne ?
– Max au Min ?

Op. 2 Op. 3
• SORT_AREA_SIZE

• Quand répartir la mémoire ? • HASH_AREA_SIZE

• Tuning !

Query 1
– Au moment de la compilation de la requête ?
– Au démarrage de l’exécution ?

Disponible

Nécessaire
Op. 1
– Pendant l’exécution ?

• Problème complexe !!! Entre les Entre les Dans un


requêtes opérateurs opérateur
• Et très Important...
81 82
37

Adapter les opérateurs à la mémoire !


• Le choix de la bonne implémentation d’un opérateur
relationnel (select, project, join, union, etc.) dépend
– de la requête qui le contient
– des caractéristiques des inputs
– de ses paramètres (prédicat de jointure, de sélection, etc.)
– des caractéristiques des données
– des structures d’indexation existantes
– et beaucoup de la quantité de mémoire disponible

• Quels sont les différents choix ?  Objet de ce cours


• Comment choisir ?  Problématique d’optimisation

83
Architecture en couche d’un SGBD
Interface

Analyseur sémantique

Optimiseur
Optimisation
Moteur d’exécution
Benjamin Nguyen

Opérations relationnelles

Méthodes d’accès aux données

Gestion de Gestion de Gestion des


Mémoire Verrous Journaux

Système opérationnel
Support construit à partir des slides de
N. Anciaux, L. Bouganim, P Borlat (Oracle Fr) et R. Ramakrishnan
1 2
38

Plan du cours Qu’est-ce que l’optimisation (1)


• Introduction Select
From
– Formulation du problème d’optimisation
Where
– Les 4 étapes de l’évaluation

• Stratégie d’évaluation et leurs optimisations


– Etape 1 et 2 : contrôle et simplification de la requête Requête SQL Arbre logique Arbre
Physique
– Etape 3 : construction de plans d’exécution candidats
– Etape 4 : choix du plan optimal (et exécution)

• L’optimiseur System R Optimisation


• L’optimisation de requêtes dans Oracle
3 4
Qu’est-ce que l’optimisation (2) Qu’est-ce que l’optimisation (2)
• Choisir la bonne alternative d’exécution parmi les nombreuses possibilités • Choisir la bonne alternative d’exécution parmi les nombreuses possibilités
– Accès par index – Accès par index
• Evaluation de la clause WHERE pour retrouver un petit ensemble de données • Evaluation de la clause WHERE pour retrouver un petit ensemble de données

– Accès séquentiel – Accès séquentiel


• Parfois, il est plus judicieux de tout parcourir même en présence d’index Exemple? • Parfois, il est plus judicieux de tout parcourir même en présence d’index Exemple?
Coût (accès peu sélectif par index non plaçant) >> Coût (Scan)
– Pas d’accès à la table – Pas d’accès à la table
• Répondre à une requête en accédant un index, sans accéder la table de base Exemple? • Répondre à une requête en accédant un index, sans accéder la table de base Exemple?

– Placement, partitionnement (par tri/hachage) – Placement, partitionnement (par tri/hachage) Cas de l’index couvrant une requête
• Une grosse opération coûteuse peut être remplacée par plusieurs petites opérations peu coûteuses • Une grosse opération coûteuse peut être remplacée par plusieurs petites opérations peu coûteuses

Exemple? Exemple? Coût (jointure par boucle N*M) >> P x Coût (jointure par boucle N/P / M/P)
• Et aussi • Et aussi
– Le bon algorithme physique – Le bon algorithme physique
– L’ordonnancement des opérateurs, – L’ordonnancement des opérateurs,
– La forme de l’arbre, etc. – La forme de l’arbre, etc.

• Problème : pour une requête donnée, choisir le plan d’exécution optimal • Problème : pour une requête donnée, choisir le plan d’exécution optimal
– Plan d’exécution = arbre d’opérations relationnelles – Plan d’exécution = arbre d’opérations relationnelles
• 1 opération = N algorithmes physiques • 1 opération = N algorithmes physiques
– 1 requête = quels plans sont à considérer ? – 1 requête = quels plans sont à considérer ?
• Recherche l’espace des plans possibles • Recherche l’espace des plans possibles
• Qualification de celui qui est (estimé) le moins coûteux • Qualification de celui qui est (estimé) le moins coûteux
• Comment estimer le coût d’un plan d’exécution ? • Comment estimer le coût d’un plan d’exécution ?
– Idéalement, recherche du plan optimal; en pratique : éviter les plans les pire… – Idéalement, recherche du plan optimal; en pratique : éviter les plans les pire…
5 6
39

Le problème : équivalence sémantique (1) Le problème : équivalence sémantique (1)


• Une question • Une question
• Plusieurs expressions • Plusieurs expressions
équivalentes en SQL équivalentes en SQL
Exemple Exemple SELECT nom SELECT nom
d’expressions d’expressions FROM Docteur D, Visite V FROM Docteur D
équivalentes en équivalentes en WHERE D.id = V.docid; WHERE D.id IN ( SELECT V.docid
SQL? SQL? FROM Visite V);

• Plusieurs expressions • Plusieurs expressions


équivalentes en algèbre équivalentes en algèbre
Exemple d’expressions Exemple d’expressions Doc∞(Vis∞Pres)
équivalentes en algèbre? équivalentes en algèbre? ≡ (Pres∞Doc)∞Vis

• Plusieurs algorithmes • Plusieurs algorithmes


algébriques équivalents algébriques équivalents
Exemple d’algorithmes Exemple d’algorithmes Hash Join, Sort
pour une même opération pour une même opération Merge Join, Hibrid
relationnelle? relationnelle? Hash Join, etc.
7 8
Le problème : équivalence sémantique (2) Les acteurs de l’optimisation
Coût

• Dans la théorie…
– 2 requêtes équivalentes en SQL (langage déclaratif) doivent, après
l’optimisation, produire le même arbre algébrique !
– Qui plus est, cet arbre doit être le meilleur !
Seuls les concepteurs de SGBD (noyau) doivent comprendre
l’optimisation et l’exécution

• Mais dans la pratique


– 2 requêtes SQL équivalentes ne donnent pas toujours le même plan
– Le plan n’est pas toujours le meilleur !
l’utilisateur (concepteur de l’appli) devra comprendre !!!
Plans sémantiquement équivalents

Plans équivalents  grandes différences de perf.


9 10
40

Les acteurs de l’optimisation (suite) Qu’est-ce qu’un plan optimal ?


Utilisateur / DBA • But de l’optimisation
– Trouver le plan d’exécution optimal
Trouver des applications pour chaque
• Ce qu’on entend par optimal type d’optimisation…
1
– Donnant les résultats le + vite ….
1 Etc… • Optimisation pour le temps de réponse

3 2 1 1 2
Requête SQL Optimiseur Plan
2 2 – Minimisant la consommation de ressources
3 3 • Optimisation du travail total
2 2
3 3

Réglage / hints Exécution – Minimisant le temps de délivrance des premiers tuples


• Optimisation de la latence (temps de retour du premier tuple)

11 12
Qu’est-ce qu’un plan optimal ? Etapes de l’évaluation
• But de l’optimisation
– Trouver le plan d’exécution optimal pour une requête ?
1. Contrôle syntaxique et sémantique
Trouver des applications pour chaque
2. Simplification de la requête (SQL)
• Ce qu’on entend par optimal type d’optimisation…
3. Décomposition en opérations élémentaires et
– Donnant les résultats le + vite ….
• Optimisation pour le temps de réponse
construction des plans d’exécution candidats
Système d’aide à la décision (OLAP), 1 seul utilisateur 4. Calcul du coût de chaque plan, choix du plan optimal
– Minimisant la consommation de ressources et exécution
• Optimisation du travail total
Système bancaire, OLTP (minimisation des ressources pour les autres transactions…)
• Les étapes 1,2 et 3 sont indépendantes des données
– Minimisant le temps de délivrance des premiers tuples • L’étape 4 est dépendante des données
• Optimisation de la latence (temps de retour du premier tuple)
Recherche Internet (ranking); MS Access fait ça  intox ?
13 14
41

Etape 1: Contrôle syntaxique & sémantique Exemple


• On considère le schéma de base de données suivant
• Analyse syntaxique – Visites (vis_id, nom_patient, prénom_patient, adresse, region)
– Presc (vis_id,med_id, date, quantité)
– Vérification de la syntaxe de la requête – Medic (med_id, labo, region, type, label)
– Et sa cohérence vis-à-vis du schéma de la base
• Relations et attributs impliqués, typage, etc. • La requête suivante
– « Nom et prénom des patients visités dans le Béarn à qui on a prescrit des
médicament du laboratoire ROCHE de type antibiotique de numéro de label < 14
après le 20 août 2010 »
• Analyse sémantique
– Vérification de la ‘signifiance’ de la question • Exprimée en SQL
SELECT nom_patient, prénom_patient
• Voir si la requête est correcte, non contradictoire, faisable, etc… FROM Medic M, Presc P, Visites V
– 2 notions permettant l’analyse sémantique des requêtes WHERE M.type = 2076
AND M.label < 14
• Graphe de connexion des relations AND M.labo = "ROCHE"
• Graphe de connexion des attributs AND P.date >= "2010-08-20"
AND V.region = "BEARN"
AND V.vis_id = P.vis_id
AND P.med_id = M.med_id
15 16
Vérifier la correction de la question (1) Vérifier la correction de la question (2)
• Notion 1 : Construction du graphe de connexion des relations
– Un sommet est associé à chaque relation
– Une jointure est représentée par un arc • Notion 2 : Construction du graphe
0
– Une sélection par une boucle sur une relation de connexion des attributs M.label 14

– Une projection par un arc vers le noeud résultat – Un sommet est associé à chaque
0
référence d’attribut ou de constante M.labo 0 Roche

P.date>="2006-08-20"
P – Un arc de la forme ai c aj
0
représente ai ≤ aj+c P.date 2006-08-20

Résultat V.vis_id=P.vis_id M.med_id=P.med_id


– Une égalité est matérialisée par 0
2 arcs valués par 0 V.region 0 BEARN
nom_patient,
prénom_patient V M
• graphe avec un cycle dont la somme 0
V.vis_id 0 P.vis_id
des valuations est négative
V.région="Béarn" M.label<14 & M.labo="Roche" 0
 Question contradictoire P.med_id 0 M.med_id

• Graphe non connexe  Question ‘incorrecte’ (relation isolée…)


– Un graphe est connexe si et seulement si
2 points quelconques du graphe sont toujours reliés par un chemin
17 18
42

Vérifier la correction de la question (3) Etape 2 : Simplification de la requête


• Ex.
• Requêtes équivalentes
SELECT * M.type 0 P.date – Deux requêtes SQL sont équivalentes SSI elles produisent
FROM Medic M, Presc P le même résultat
WHERE M.type = 1978 0 0

AND P.date <= 1976 -2


• Deux moyens de trouver des requêtes équivalentes
AND M.type = P.date 1978 1976
– Utilisation de la logique des prédicats
• Simplification de critères
– Utilisation des contraintes d’intégrité
• Cycle de valuation -2  sélection infaisable
• Détection des requêtes sans résultat
• Rajout éventuel de critères permettant d’utiliser un index

19 20
Utilisation de la logique des prédicats Utilisation de la logique des prédicats
• Ex. Requête initiale • Ex. Requête initiale
SELECT * FROM Medic M SELECT * FROM Medic M
WHERE ((M.label = 12) P WHERE ((M.label = 12) P
OR (M.labo = ‘WHITEHALL') Q OR (M.labo = ‘WHITEHALL') Q
OR (M.labo = ‘AVENTIS')) R OR (M.labo = ‘AVENTIS')) R
AND NOT ((M.labo = ‘WHITEHALL') Q AND NOT ((M.labo = ‘WHITEHALL') Q
OR (M.labo = ‘AVENTIS ')) ; R OR (M.labo = ‘AVENTIS ')) ; R

• Critère: ((P ∨ Q ∨ R) ∧ NOT (Q ∨ R)) • Critère: ((P ∨ Q ∨ R) ∧ NOT (Q ∨ R))


≡ ((P ∨ Q ∨ R) ∧ (NOT Q ∧ NOT R)) ≡ ((P ∨ Q ∨ R) ∧ (NOT Q ∧ NOT R))
≡ (P ∧ NOT Q ∧ NOT R) ∨ (Q ∧ NOT Q ∧ NOT R) ∨ (R ∧ NOT Q ∧ NOT R) ≡ (P ∧ NOT Q ∧ NOT R) ∨ (Q ∧ NOT Q ∧ NOT R) ∨ (R ∧ NOT Q ∧ NOT R)
≡ P ∧ NOT Q ∧ NOT R Pourquoi l’utilisateur écrirait-il une requête
≡ P ∧ NOT Q ∧ NOT R Pourquoi l’utilisateur écrirait-il une requête
idiote comme celle ci ? idiote comme celle ci ?
• Requête équivalente avec critère simplifié • Requête équivalente avec critère simplifié
1) c’est une requête sur une vue
SELECT * FROM Medic M SELECT * FROM Medic M 2) une interface construit la requête (par
WHERE (M.label = 12) P WHERE (M.label = 12) P clics successifs) et peut arriver à ça
AND NOT (M.labo = ' WHITEHALL') Q AND NOT (M.labo = ' WHITEHALL') Q 3) etc.
AND NOT (V.labo = 'AVENTIS'); R AND NOT (V.labo = 'AVENTIS'); R

21 22
43

Utilisation des contraintes d'intégrité (1) Utilisation des contraintes d'intégrité (2)
• Deux types d’utilisation des contraintes d’intégrité • 2 – Pour compléter le critère afin de profiter d’un index
– 1 – Pour identifier une requête sans résultat
• Etant donné une requête avec un critère Q – Ex.
• Et un ensemble de contraintes d’intégrité {CI1, CI2, … CIn} • Requête = SELECT * FROM Medic
• Si : Q est contradictoire avec l’une des contraintes CIi WHERE labo = 'Roche'
• Alors : la requête a une réponse vide
• Ex.
• Il y a un index sur Medic.label
– Requête = SELECT * FROM Medic
(Mais pas d’index sur Medic.labo…)
WHERE labo = 'Roche'
AND label < 10 • Et une contrainte d’intégrité sur Medic: labo = 'Roche'  label > 12
– Contrainte d’intégrité sur Medic : labo = 'Roche'  label > 12
– Requête modifiée = • Requête modifiée = SELECT * FROM Medic
SELECT * FROM Medic WHERE labo = 'Roche'
WHERE labo = 'Roche'
AND label < 10 AND label > 12
AND label > 12
 La requête est sans réponse…
– 2 – Pour compléter le critère afin de profiter d’un index…
 L’index est utilisable pour évaluer la requête…
23 24
Etape 3 : Construction de plans candidats Ex. Plan d’exécution candidat (1)
• A partir des opérateurs relationnels suivants: R
Requête
Projection « Nom et prénom des patients nom_patient
prénom_patient
Selection visités dans le Béarn à qui on a
V.med_id, V.labo
M.labo=‘ROCHE’
prescrit des médicament du
laboratoire ROCHE de numéro labo = “Roche"
de label = 17 après le 20 août ^ Region = “Béarn"
Jointure 2006 » ^ date > "20/08/2006"
Différence ^ label = 17
R S _
R.a = S.b
med_id med_id
=
R S
Produit vis_id vis_id
Cartésien Union =
X U
V P M
R R S
S
Plan candidat N°1
25 26
44

Ex. Plan d’exécution candidat (2) Ex. Plan d’exécution candidat (2)
Plan candidat N°2 Plan candidat N°3 Plan candidat N°2 Plan candidat N°3
R R R R

nom_patient nom_patient nom_patient nom_patient


prénom_patient prénom_patient prénom_patient prénom_patient

med_id med_id vis_id vis_id med_id med_id vis_id vis_id


= = = =

vis_id vis_id med_id med_id vis_id vis_id med_id med_id


= = = =

Region = date> labo = “Roche" Region = date> labo = “Roche"


“Béarn" "20/08/2006" ^ label = 17 labo = “Roche" “Béarn" "20/08/2006" ^ label = 17 labo = “Roche"
Region = date > Region = date >
“Béarn" "20/08/2006" ^ label = 17 “Béarn" "20/08/2006" ^ label = 17

V P M V P M
V P M V P M

De ces 3 arbres, lequel est le meilleur ? De ces 3 arbres, lequel est le meilleur ?

Le premier est sûrement moins bon, mais les 2 derniers ?


27 28
Etape 3 : plans d’exécution candidats Importance du choix des candidats (1)
• On considère le schéma de base de données suivant
• Lorsque la requête est correcte, le but est de – Visites (vis_id, nom_patient, prénom_patient, adresse, region)
construire et examiner des plans d’exécution – Presc (vis_id,med_id, date, quantité)
candidats, avec un coût d’exécution faible – Medic (med_id, labo, region, type, label)

• La requête suivante
• 2 méthodes pour énumérer les plans ‘intéressants’ – “nom des patient ayant fait des Visites dans le BEARN à qui on a prescrit
des médicaments du labo Roche”
– Heuristique : la restructuration algébrique
– Modèle de coût : l’évaluation de plans • Exprimée en SQL de la façon suivante
– Remarque : ces 2 méthodes ne sont pas exclusives… SELECT nom_patient, med_id, date
FROM Medic M, Presc P, Visites V
WHERE V.vis_id = P.vis_id
AND P.med_id = M.med_id
AND M.labo = "Roche"
AND V.region = "BEARN"
29 30
45

Importance du choix des candidats (2) Importance du choix des candidats (3)
• Distributions des données de la base • Comparaison de 3 plans candidats…
– 100 Visites dont 5 dans le BEARN (20 pages) – Stratégies 1
• Exécuter les opérations dans l’ordre de la clause WHERE
– 500 Médicaments dont 50 du labo ROCHE (50 pages)
• Exécuter les jointures par Boucles Imbriquées
– 2000 Prescriptions (200 pages) – Stratégies 2
• Idem mais les jointures sont faites par Tri Fusion
• On suppose une equi-répartition des données – Stratégies 3
– En moyenne, 20 Presc par Visite et 4 Presc par Médicament • Exécuter les sélections avant les jointures
• Exécuter les jointures par Boucles Imbriquées
• La requête donne 10 tuples résultat
• Coût de la stratégie 1
• Information sur le stockage – 1ère phase: jointures Visites ∞ Presc ∞ Medic
– 1 page disque peut contenir • Nombre de pages lues
– (100/5) * (2000/10) * (500/10) = 20 * 200 * 50 = 200.000 I/Os
• 5 Visites, 50 Noms, 10 Médicaments ou 10 Prescriptions
• Nombre de pages écrites
– 2000 tuples résultat = 2000*(1/5+1/10+1/10) = 800 pages = 800 I/Os
• Toutes les relations sont triées sur clé – 2ème phase : sélections puis projections
• 800 lectures + 1 écriture = 801 I/Os
• Coût du tri d’une relation de N pages = 2*N*Log2 N – Total > 200.000 I/Os
31 32
Importance du choix des candidats (4) Importance du choix des candidats (5)
• Coût de la stratégie 2 • Coût de la stratégie 3
– Exécuter les opérations dans l’ordre de la clause WHERE – Exécuter les sélections avant les jointures
– Exécuter les jointures par Tri Fusion – Exécuter les jointures par Boucles Imbriquées
– 1ère phase: jointures Visites ∞ Presc  TEMP1 – 1ère phase: sélection Visites  TEMP1
• Nombre de pages lues • Nombre de pages lues
– (100/5) + (2000/10) = 20 + 200 = 220 I/Os – (100/5) = 20 I/Os
• Nombre de pages écrites
• Nombre de pages écrites
– 5 tuples résultat = 1 page = 1 I/Os
– 2000 tuples résultat = 2000*(1/5+1/10) = 600 pages = 600 I/Os
– 2eme phase : sélection Medic  TEMP2
– 2eme phase : tri de TEMP1 sur med_id • Nombre de pages lues
• 2 *600*LOG2(600) = 2*600*9,.. = 11.075 I/Os – (500/10) = 50 I/Os
– 3ème phase : Jointure TEMP1 ∞ Medic • Nombre de pages écrites
• Nombre de pages lues – 50 tuples résultat = 5 pages = 5 I/Os
– (600) + (500/10) = 650 I/Os – 3ème phase : Jointure TEMP1 ∞ Presc ∞ TEMP2
• Nombre de pages écrites • Nombre de pages lues
– 2000 tuples résultat = 800 pages = 800 I/Os – 1 * (2000/10) * 5 = 1.000 I/Os
• Nombre de pages écrites
– 4ème phase : selections puis projections
– 10 tuples résultat = 4 page = 4 I/Os
• 800 lectures + 1 écriture = 801 I/Os
– Total = 1080 E/S
– Total = 14.146 I/Os 33 34
46

Restructuration algébrique Equivalences de l’algèbre relationnelle


• L’algèbre relationnelle définit des équivalences
• Problème
– Deux expressions relationnelles sont équivalente SSI
– Suivant l’ordre des opérateurs algébriques dans un arbre, le elles produisent le même résultat
coût d’exécution est différent
• Ces équivalence permettent notamment de
– Commuter des opérations de jointure
• Pourquoi ?
– ‘Pousser’ les sélection/projection avant les jointures
– Le coût des opérateurs varie en fonction du volume de
données à traiter • Exemples de règles d’équivalence
• Cardinalité de la relation en entrée petite  coût faible – Sélections σc1∧c2∧…∧cn(Doc) ≡ σc1(σc2(… σcn(Doc))) (Groupement)
– Certains opérateurs diminuent le volume de données σc1(σc2(Doc)) ≡ σc2(σc1 (Doc)) (Commutation)
– Projections πa1(Doc) ≡ πa1(πa2(… πan(Doc))) (Groupement)
• Ex. Sélections, projections, etc.
– Jointures Doc∞(Vis∞Pres) ≡ (Doc∞Vis)∞Pres (Association)
Doc∞Vis ≡ Vis∞Doc (Commutation)
• La restructuration algébrique
(etc…)
– Consiste à transformer l’arbre pour en minimiser le coût
– D’après les équivalences de l’algèbre relationnelle… Montrer que
Doc∞(Vis∞Pres) ≡ (Pres∞Doc)∞Vis

35 36
Equivalences de l’algèbre relationnelle Autres règles d’équivalence
• L’algèbre relationnelle définit des équivalences • Une projection commute avec une sélection qui utilise des
– Deux expressions relationnelles sont équivalente SSI attributs conservés par la projection (Semi commutativité)
elles produisent le même résultat

• Ces équivalence permettent notamment de – Ex. πNom(σNom>’%D’(Doc)) ≡ σNom>’%D’(πNom(Doc))


– Commuter des opérations de jointure
– ‘Pousser’ les sélection/projection avant les jointures • Une sélection sur R commute avec R∞S (distributivité de σ /∞)
• Exemples de règles d’équivalence (3eme est faux)
– Sélections σc1∧c2∧…∧cn(Doc) ≡ σc1(σc2(… σcn(Doc))) (Groupement) – σC1(R∞S) ≡ (σC1(R))∞S, avec C1 critère sur attributs de R
σc1(σc2(Doc)) ≡ σc2(σc1 (Doc)) (Commutation)
– Projections πa1(Doc) ≡ πa1(πa2(… πan(Doc))) (Groupement)
– Jointures Doc∞(Vis∞Pres) ≡ (Doc∞Vis)∞Pres (Association)
• Si une projection suit une jointure R∞S, on peut la ‘pousser’ en
Doc∞Vis ≡ Vis∞Doc (Commutation) retenant seulement les attributs de R (et de S) nécessaires à la
(etc…) jointure (ou aux projection finales) (distributivité de π /∞)
Doc∞(Vis∞Pres) ≡ Doc∞(Pres∞Vis) (Commutatif)
Montrer que
Doc∞(Vis∞Pres) ≡ (Pres∞Doc)∞Vis
≡ (Doc∞Pres)∞Vis (Associatif) – Ex. πNom, Date (Doc∞Vis) ≡ πNom(πNom, id (Doc) ∞ πDate, docid (Vis))
≡ (Pres∞Doc)∞Vis (Commutatif)
37 38
47

Bilan sur les règles d’équivalences Etape 4 : Choisir le meilleur plan


1
Commutativité des ∞
2 Associativité des ∞
• Heuristique d'Optimisation
R S ≡ S R
– Appliquer d'abord les opérations réductrices (sélections et
T ≡ R

Groupabilité des π R S S T
projections) en les groupant sur chaque relation
Groupabilité des σ
Ai
Ai,Aj
3
≡ Ai = a 1. Dégrouper les sélections/projections (Règle 3)
Aj Ai = a
et
≡ Aj = b
2. Rapprocher les sélections des feuilles (Règles 4, 5 et 7)
Aj = b

3. Grouper les sélections aux feuilles (Règle 3)


R.Aj = a
et
S.Aj = b 4 4. Rapprocher les projections des feuilles (Règles 4, 6 et 8)
≡ R.Ai = a S.Aj = a
A1,..,Ai A1,..,Ai

5 R S R S
Aj = a
≡ Aj = a
Distributivité des σ / ∞
Aj
• L'ordre des unions, différences et jointures est
et
• Et aussi…
– Distributivité des π / ∞ 6 A1,..,Ai
inchangé !!!


Distributivité des σ / Unions & différences
Distributivité des π / Unions
7 Semi commutativité de π avec σ
8 39 40
Exemple d'optimisation (nom,prénom
Optimisation physique
dans visite)
R
• Choix des meilleurs algorithmes pour les opérations
R nom_patient
prénom_patient relationnelles
nom_patient
prénom_patient
med_id med_id
– Utilisation des indexs
– jointure par index, boucles imbriquées, etc...
=

labo = "Roche" med_id


^ Region = “Béarn"
^ Label = 17
nom_patient
prénom_patient • En fonction de
^ date > "15-05-2006"
vis_id
=
vis_id – Structures de données existantes
med_id med_id – Statistiques sur les relations
vis_id nom_patient
vis_id prénom_patient
– Algorithmes existant
=
med_id med_id
vis_id vis_id
=
date > Region =
"15-05-2006" “Béarn"
V P M labo = "Roche"
^ Label = 17
V P M

41 42
48

Statistiques et catalogues Choix des chemins d’accès aux données


• Chemins d’accès aux données
• L’optimiseur a besoin d’informations sur les objets impliqués – i.e., façon de retrouver les tuples qualifiés par une expression (sélection dans la
requêtes)
– Ex. parcours séquentiel de la table ou accès par index
• Les catalogues contiennent ce type d’information, notamment
• Critères de sélection d’abord convertis en ‘forme normale conjonctive’
– Tables : nombre de tuples, nombre de pages
– (jour<01-fev-07 AND Nom=‘Bob’) OR id=5 OR did=3’
– Index : nombre de clés (distinctes), nombre de pages – FNC : (jour<01-fev-07 OR id=5 OR did=3) AND (Nom=‘Bob’ OR id=5 OR did=3)
– Hauteur des index, plus petite/plus grande valeur de clé…
• Un index basé sur le tri (ex. arborescent) permet de répondre à un critère
impliquant des termes préfixes de la clé de l’index
– Ex. un index arborescent sur <a,b,c> permet de répondre aux critères a=5 AND
• Les catalogues sont mis à jour périodiquement b=3, et a=5 AND b>6, mais pas b=3
– Mise à jour systématique (à chaque modification) trop chère
• Un index basé sur du hachage permet de répondre à une conjonction de
– Beaucoup d’approximations… termes impliquant tous les attributs de la clé de l’index sur critère d’égalité
– Ex. un index par hachage sur <a,b,c> permet de répondre aux critères a=5 AND
b=3 AND c=4, mais pas a=5 AND b=3, ni a>5 AND b=3 AND c=4
• Des informations plus détaillées parfois disponibles
– Ex. l’histogramme des valeurs d’un attribut particulier L’index par hachage permet-il de répondre à a=5 AND b=3 OR c=4 ?
43 44
Choix des chemins d’accès aux données Une approche pour optimiser les sélections
• Chemins d’accès aux données • Trouver le chemin d’accès le plus sélectif
– i.e., façon de retrouver les tuples qualifiés par une expression (sélection dans la – Le plus sélectif en nombre d’I/Os
requêtes)
– Sur tout ou partie du critère de sélection
– Ex. parcours séquentiel de la table ou accès par index

• Critères de sélection d’abords convertis en ‘forme normale conjonctive’ • Accéder les tuples en utilisant ce chemin
– (jour<01-fev-07 AND Nom=‘Bob’) OR id=5 OR did=3’
– FNC : (jour<01-fev-07 OR id=5 OR did=3) AND (Nom=‘Bob’ OR id=5 OR did=3) • Vérifier ensuite tous les termes restant du critère
– i.e., ceux que l’index n’a pas pu évaluer
• Un index basé sur le tri (ex. arborescent) permet de répondre à un critère
impliquant des termes préfixes de la clé de l’index – Ces termes sont évalués sur les tuples accédés
– Ex. un index arborescent sur <a,b,c> permet de répondre aux critères a=5 AND – Cette évaluation réduit le nombre de tuples qualifiés,
b=3, et a=5 AND b>6, mais pas b=3 – Mais n’a pas d’impact sur le nombre d’I/Os…
• Un index basé sur du hachage permet de répondre à une conjonction de • Ex. critère date>12/01/2007 AND quantité = 5 AND doc_id = 2
termes impliquant tous les attributs de la clé de l’index sur critère d’égalité
– Ex. un index par hachage sur <a,b,c> permet de répondre aux critères a=5 AND
– Arbre B+ sur date utilisé pour sélectionner les tuples date>12/01/2007
b=3 AND c=4, mais pas a=5 AND b=3, ni a>5 AND b=3 AND c=4 – Ensuite, les termes restant quantité = 5 AND doc_id = 2 doivent être
vérifiés sur chaque tuple sélectionné
L’index par hachage permet-il de répondre à a=5 AND b=3 OR c=4 ? – De la même manière, un index par hachage sur <quantité, doc_id> peut
FNC : (a=5 OR c=4) AND (b=3 OR c=4)  par hachage, on ne peut pas évaluer a=5 OR c=4… 45 être utilisé. Le terme date>12/01/2007 doit être vérifié ensuite. 46
49

Ordonnancement des accès aux tables Introduire des semi-jointures


• Si une seule table est impliquée dans la requête • Principe
– Choisir les meilleurs chemins d’accès aux données possibles
– Ex. favoriser les algorithmes par index 1. Projeter R sur l’attribut de jointure (sans doublon) dans R’
(pour les sélections, jointures sur index, …)

• Dès que plusieurs tables sont impliquées : problème d’ordonnancement


2. Lire S, et ne retenir que les tuples existant dans R’
• Objectif de l’ordonnancement 3. On joint les tuples résultat avec R
– Ordonner correctement les jointures, unions, différences, …
• En fonction des tailles des relations arguments
Quel peut être l’intérêt de cette technique ?
– Mais toujours : choisir les meilleurs chemins d’accès aux données possibles!
• Le problème
– Augmentation exponentielle des plans candidats avec le nombre de relations engagées
– Comment réduire l’espace de recherche ?
• Nécessité
– Il faut développer un modèle de coût général
• permettant d'évaluer le coût d'un plan,
• c'est-à-dire d'un arbre annoté par des choix d'algorithmes
– NB: annotation
• Marque associée à un nœud indiquant l'algorithme à utiliser pour l'opérateur
(avec ses paramètres: index, hachage, …)

47 48
Introduire des semi-jointures Modèle de coût
• Principe • Pour chaque plan considéré, en estimer le coût
– Estimation du coût de chaque opérateur de l’arbre
1. Projeter R sur l’attribut de jointure (sans doublons) dans R’ • Dépend de la cardinalité en entrée(s)
2. Lire S, et ne retenir que les tuples existant dans R’ • De l’algorithme utilisé
• De la façon dont on produit la sortie (pipeline, matérialisation)
3. On joint les tuples résultat avec R
– Il faut pourvoir estimer la cardinalité des résultats de chaque opérateur
• Utilisation des informations de cardinalités des tables de base
Quel peut être l’intérêt de cette technique ?
• Pour les sélections et les jointures, dépend du critère (facteur de restriction)
• L’optimiseur suppose (en général) l’indépendance des critères…
• Il faut donc fabriquer un modèle de coût
Le résultat de 1 est très petit (seulement les valeurs distinctes de la clé de jointure).
L’étape 2 filtre S (semi-jointure). L’étape 3 joint les tuples de R avec le résultat du
– Paramètres d’entrée du modèle de coût
filtrage de S. • Machine (puissance, disques, mémoire, réseau, etc..)
Si R et S sont sur 2 sites différents, très peu de données sont transmises : • Arbre d’exécution, algorithmes relationnels
S1  S2 : valeurs distinctes de la clé de R • Schéma de la base, statistiques sur les relations
S2  S1 : relation S filtrée • Cardinalités, tailles, valeurs distinctes, répartition, histogrammes…
NB : mais pas grand intérêt dans ce cas précis si R et S sont sur le même site… – Sortie
• Evaluation de la taille des résultats intermédiaires
49 • Evaluation du coût: en termes d’I/O, CPU, etc... ou un coût global 50
50

Espace de recherche Notion de pipeline / matérialisation


• Facteurs jouant sur la taille de l’espace de recherche
build
Imp
ossi

output
ble

– A chaque table correspond plusieurs chemins d’accès


d'a

R R hash table
ffic

Probe 1 h(R.a) buffer R S


– A chaque opérateur correspond plusieurs algorithmes Im
po
ssi
ble
Imp
ossi
ble
d'a
ffic

• Algorithme physique de jointure, élimination des doubles, etc. Build 1 Scan S


S
R S Imp h(S.b) probe
– Les opérateurs peuvent être ordonnancés différemment
ossi
ble
d'a
ffic

Scan R Memory
• En plus : les opérations binaires ne sont pas symétriques
Décrire l’algorithme de jointure par hachage (Hash Join)…
– Notion de relation externe / interne (même pour 1 algorithme fixé!)
– Notion de pipeline / matérialisation
• Notion de lien bloquant / non bloquant
– Convention (du cours) : entrée gauche des opérateurs est matérialisée… DOC
Table de
hachage
 Différentes formes d’arbres sont possibles. Influence sur
Table de Test
DOC
• La consommation mémoire hachage
Table de
VIS
• Le mode d’exécution VIS Test hachage

• et donc les performances Hash Join : bloquant Hybrid Hash Join : Non bloquant

Applications respectives?
51 52
Notion de pipeline / matérialisation Arbre linéaire droit (right deep tree)
build • L’une des tables passe complètement en pipeline
Imp
ossi

output
ble
d'a

R R hash table
ffic

Probe 1 R S
Im
po
Imp
ossi
h(R.a) buffer
• En général, il s’agit de la plus grosse table…
• Ex. R passe en pipeline
ssi ble
ble d'a
ffic

Build 1 Scan S Probe 3


R S S h(S.b)
Imp
ossi
ble
probe Impossib
Impossibl
e
d'a d'afficher
le
ffic l'image.
d'afficher
Votre

Memory
l'image.
ordinateur

Scan R
Votre
ordinate

Probe 2
Build 3
Impossibl

Décrire l’algorithme de jointure par hachage (Hash Join)…


e
II d'afficher
Impossib l'image.
m
m Impossibl le Votre
p

U
p e d'afficher ordinateu
os
o d'afficher
Impos l'image.
si
s l'image.
sible Votre
d'affic
bl
s Votre ordinate
Probe 1
Build = construction en mémoire de la table de hachage de R; her iI ordinateu
l'imag b
m
lp
e
o Scan U Build 2
Probe = test des tuples de S sur la table de hachage et production des résultats T
s
si
Impossi
ble
Impossibl
e
d'affiche d'afficher
r l'image.
Impossibl
l'image. Votre
e
Votre ordinateu
d'afficher
l'image.

Build 1
Votre

S
ordinateu

Table de R Scan R
DOC Scan T
hachage Impossibl
e
d'afficher
l'image.
Votre
ordinateu
Table de Test
DOC
hachage Scan S
Table de
VIS Test VIS
hachage

Hash Join : bloquant Hybrid Hash Join : Non bloquant


• La taille mémoire consommée est importante…
Temps d’exécution total Temps de latence Quelle est la taille mémoire nécessaire ?
Applications respectives?
(banque) (recherche Internet)
53 54
51

Arbre linéaire droit (right deep tree) Arbre linéaire gauche (left deep tree)
• Le résultat de chaque jointure est envoyé en pipeline à l’opérateur suivant
• L’une des tables passe complètement en pipeline – Pas de stockage de la sortie de chaque opérateur sur disque
• En général, il s’agit de la plus grosse table… (transmission directe à l’opérateur suivant…)
• Ex. R passe en pipeline • Le flot grossit : ordonner les jointures selon leur sélectivité
Probe 3
Impossibl
Probe 3
e
Impossib
d'afficher
le
l'image. Impossible
d'afficher Impossible
Votre d'afficher
l'image. d'afficher
ordinateur l'image. Votre
Votre l'image. Votre
ordinate

Probe 2 Build 3 Scan U


Build 3 Impossible
Impossibl d'afficher
e l'image. Votre
II
m
m
p
Impossibl
Impossib
le
d'afficher
l'image.
Votre
Probe 2
U
p e d'afficher ordinateu
os
o d'afficher
Impos l'image.
si
s l'image.
sible Votre
d'affic
her
bl
s
iI
Votre
ordinateu
ordinate
Probe 1 Impossible
d'afficher
l'image. Votre
Impossible
d'afficher

U
l'imag b
m
lp l'image. Votre

s
e
o Scan U Build 2 Im Build 2
T
si
Impossi
ble
Impossibl
e
po
ssi Scan T
d'affiche d'afficher Impossible
Impossibl
e
r
l'image.
Votre
l'image.
Votre
ordinateu
T d'afficher
l'image. Votre
d'afficher
l'image. Probe 1
Build 1
Votre

S
ordinateu
R Scan R
Scan T R S Impossible
d'afficher
l'image. Votre
Impossible
d'afficher
Impossibl

Build 1
l'image. Votre
e
d'afficher
l'image.
Votre
ordinateu
Scan S
Impossible
d'afficher

Scan S l'image. Votre

Scan R

• La taille mémoire consommée est importante… • La taille mémoire consommée est moindre…
Quelle est la taille mémoire nécessaire ?
Quelle est la taille mémoire nécessaire ? Build1 + Build2 + Build3 = |S| + |T| + |U|
55 56
Arbre linéaire gauche (left deep tree) Arbre bushy (bushy tree)
• Le résultat de chaque jointure est envoyé en pipeline à l’opérateur suivant • Mélange des deux stratégies précédentes
– Pas de stockage de la sortie de chaque opérateur sur disque
(transmission directe à l’opérateur suivant…) Probe 3

• Le flot grossit : ordonner les jointures selon leur sélectivité Impossibl


e
d'afficher
l'image.
Votre
Impossible
d'afficher
l'image.
Votre
ordinateur
ordinateu manque

Probe 3 Build 3 Probe 2


Impossible Impossible Impossibl Impossible
d'afficher d'afficher Impos Impos Impossible e d'afficher
l'image. Votre l'image. Votre sible sible d'afficher d'afficher l'image.
d'affic d'affic l'image. l'image. Votre

Build 3
her her Votre ordinateur

Scan U
Votre
l'imag l'imag Im ordinateur ordinateu manque
e. e. po manque
Votre Votre ssi
I

Build 2 Scan U
ordina
I ordina
Impossible
d'afficher
l'image. Votre
teur
m
manqu
teurm
manqu Probe 1
e e

Probe 2 peut-
être
de
peut-
être de
mémoi
Impossibl Impossible Impossibl

S T U
e d'afficher e
Impossible
d'afficher Impossible
R d'afficher
l'image.
l'image.
Votre
d'afficher
l'image.
l'image. Votre d'afficher Votre ordinateur Votre

U Build 2
l'image. Votre ordinateu manque ordinateur

Im
po
ssi Scan T Build 1 Scan S Scan T
Impossible

T d'afficher
l'image. Votre Impossible

Probe 1
d'afficher
l'image.
Votre
ordinateur
manque

R S Impossible
d'afficher Impossible
l'image. Votre d'afficher
Scan R
Build 1
l'image. Votre

Scan S
Impossible
d'afficher
l'image. Votre

Scan R
• La taille mémoire consommée est intermédiaire…
• La taille mémoire consommée est moindre…
Quelle est la taille mémoire nécessaire ? Quelle est la taille mémoire nécessaire ?

MAX(Build1; [Build1+]Build2; [Build2+]Build3)= MAX(|R|; |R|+|R ∞ S|; |R ∞ S|+|R ∞ S ∞ T|)


57 58
52

Arbre bushy (bushy tree) Conclusion sur la taille de l’espace de recherche


• Mélange des deux stratégies précédentes • Sans considérer les différents algorithmes ni la consommation mémoire
– Jointure de 5 relations (avec produits cartésiens)
Probe 3 • 120 arbres linéaires différents
Impossibl
e
d'afficher
Impossible
d'afficher
l'image.
• 1620 arbres bushy différents
Probe 3
– Jointure de 10 relations (idem)
l'image. Votre
Votre ordinateur
ordinateu manque
Im
Im po
Probe 2 po

Build 3 • 3 628 800 arbres linéaires différents Build 3


Probe 2
Im

• 17 643 225 600 arbres bushy différents !!!


Im
Impossibl Impossible I I po
Im po
Impos Impos Impossible e d'afficher m m
l'image. p p po

Scan U
sible sible d'afficher d'afficher
d'affic
her
d'affic
her
l'image.
Votre
l'image.
Votre
Votre
ordinateur
o
s
o
s Im Build 2
l'imag
e.
Votre
l'imag
e.
Votre
Im
po
ordinateur
manque
ordinateu manque s
i
b
s
i
b
po
ssi Probe 1 Im
po
ssi
I

Build 2
Im
Scan U
ordina
I ordina l l
teur
m
manqu
teurm
manqu Probe 1 e e
I
m
po
Scan T
e e
peut-
être
de
peut-
être de
mémoi
R S T U Build 1 Scan S
Impossibl Impossible Impossibl Im
po
S T U
e d'afficher e
R d'afficher l'image. d'afficher
l'image.
Votre
ordinateu
Votre
ordinateur
manque
l'image.
Votre
ordinateur
Arbre linéaire gauche (left deep tree) Arbre Bushy (Bushy tree) Scan R
Build 1 Scan S Scan T
I
Probe 3
Impossible
d'afficher
l'image.
Impo Impos
sible
Probe 3 Arbre linéaire droit (right deep tree)
Build3 ScanU
Votre Im
ordinateur Im po
po ssi

U
manque
Impos ssi

Scan R Probe 2 Probe 2 Im


po
Impos
sible
d'affic Impo
Build 3 Im
ssi

her Impos po

T
l'imag Im

Build2
Im ssi
e. po
po

ScanT
I

U
Votre ssi

Probe 1
ssi
ordin
ateur Impos Imp
manq
ue Im
po
sible

Probe 1 Scan U Build 2 I Im


ossi
ble
d'a
ssi

R S m po ffic
Impo Im p ssi
T her

• La taille mémoire consommée est intermédiaire…


Impos l'im
po

Build1
age
ssi

ScanS Build 1 .

ScanT Scan R
S
Impos
Im
po R
ScanR ssi

Quelle est la taille mémoire nécessaire ? Scan S

MAX(Build1; Build1+Build3; Build2+Build3)= MAX(|R|; |R|+|R ∞ S|; |R ∞ S|+|T|)  L’espace de recherche est très grand…
59 60
Recherche du meilleur plan Stratégies de recherche
• But de la stratégie de recherche
Graphe d'opérations Schéma interne
– Minimiser l’espace de recherche
– Sans trop réduire l’efficacité du choix…
Plans d'exécution
(espace de recherche)
Stratégie de
Bibliothèque de Enumération de recherche Evaluation de plans
Générateur de plans possibles (pseudo) aléatoires
transformations
Plans

Stratégie de Enumérative Aléatoire


Heuristiques Dynamic
Recherche programming,
de choix cf. System R
Modèle de coût
Augmentation Amélioration Recuit Théorie
Exhaustive heuristique simulé génétique
itérative
Plan d'exécution
Optimal TOUS les plans possibles. On essaye une heuristique (optim), si c’est mieux on
Résultat optimal, perf. continue, sinon on revient. On génère un autre arbre
61 inacceptables quand le coût n’évolue plus (et pas assez bon) 62
53

Optimisation dynamique Optimisation parallèle


• Stratégie ‘one phase optimization’
• L’optimisation peut se faire à la compilation – On produit un espace de recherche contenant des plans parallèles
– Explosion de l’espace de recherche
– Optimisation dite statique
– Complexe (modèle de coût)
– Le coût n’est pas imputé à l’utilisateur
– Optimisation des requêtes fréquemment posées
• Stratégie ‘two phase optimization’
– On peut ‘prendre son temps’ (dans une certaine mesure)
– hypothèse: le meilleur plan parallèle est une parallélisation du meilleur
pour trouver le meilleur plan plan séquentiel
– Simple
• L’optimisation au moment de l’exécution
– Dite dynamique • Problèmes
• Peut compléter l’optimisation statique (mises à jours…) – Localisation des relations  Localisation des opérateurs
– Juste avant l’exécution – Labels de parallélisme ?
– Pendant l’exécution – Séquençage (scheduling) des opérations ?

63 64
Optimisation distribuée Ex. L’optimiseur System R
• Même type de problèmes que pour le parallélisme • System R
– Arbre d’opérateurs – L’optimiseur le plus largement utilisé aujourd’hui
– Localisation des opérateurs – Fonctionne bien pour un nombre de jointures < 10
– Séquençage des opérateurs • Estimation du coût : approximation au mieux
– A base de statistiques maintenues dans le catalogue
• Utilisées pour estimer le coût des opérations
• Mais le contexte est différent… • Et la taille des résultats
– Coût réseau importants – Combine le coût en CPU et le coût en I/Os
– Duplications fréquente • Espace de recherche
– Fragmentation vetricale et horizontale – Réduit aux arbres linéaires gauches
• NB: permet de ne pas stocker la sortie de chaque opérateur sur
disque mais la transmet directement comme entrée de l’opérateur
suivant…
• Techniques complexes (voir T. Ozsu, P. Valduriez)
– Les produits cartésiens sont évités…
65 66
54

Plan d’exécution candidats (1) Plan d’exécution candidats (2)


• Deux cas principaux • Requêtes impliquant plusieurs relations
– Requêtes n’impliquant qu’une relation – Seuls les arbres linéaires gauches sont considérés
• Décision fondamental dans System R
– Requêtes impliquant plusieurs relations • L’espace de recherche augmente exponentiellement avec le nombre de jointures
• Requêtes n’impliquant qu’une relation • Il doit donc être réduit
– Impliquent des sélections, projections et calculs d’agrégats • Les arbres linéaires gauches permettent de générer des arbres complètement pipeline
– Les résultats intermédiaires ne sont pas écrits sur disques
– Chaque chemin d’accès (scan, index) est considéré – Mais ça n’est pas possible avec tous les algo. (Sort Merge Join)
• Le moins coûteux (estimation) est choisi – Les arbres linéaires gauches candidats diffèrent par
– Les opérations sont effectuées en même temps • L’ordre des relations
• Ex. si un index est utilisé pour évaluer une sélection, chaque tuple est • Les méthodes d’accès aux relations
projeté, et le résultat est fourni à l’opérateur de calcul d’agrégat • L’algorithme physique de jointure utilisé
– Estimation des coûts avec une relation – Algorithme ‘dynamic programming’ pour N jointures
• Index sur clé primaire pour les critères d’égalité • Enumération des candidats en N passes
– Arbre B+ = Hauteur+1 I/Os, hachage = 1,2 I/Os – Passe 1 : trouver le meilleur plan pour chaque relation (plans à 1 relation)  N
candidats
• Index plaçant pour évaluer les critères d’égalité – Passe 2: trouver la meilleure façon de joindre chacun de ces plan à 1 relation
– (Nb pages dans l’index + Nb pages de la table) * taux de sélection avec chacune des autres relations (plans à 2 relations)  N*(N-1) candidats
• Index non plaçant pour évaluer les critères d’égalité – Passe N: trouver la meilleure façon de joindre chacun de ces plan à (N-1)
– (Nb pages dans l’index + Nb tuples de la table) * taux de sélection relations avec chacune des autres relations (plans à N relations)
• A chaque étape, ne retenir que
• Parcours d’une relation
– Les plans les moins cher (au total) pour chaque ensemble de relations identiques
– Nombre de pages de la relation – Plus les plans (plus chers) produisant son résultat en ordre ‘intéressant’ (ex. triés)
67 68
Plan d’exécution candidats (3) Plan d’exécution candidats (4)
• Estimation des coûts avec plusieurs relations • Les clause ORDER BY, GROUP BY, agrégats etc.
Ex. SELECT liste d’attributs – Considérées à la fin
FROM liste de relations – Remarques
WHERE terme1 AND … AND termek • Soit le plan produit un résultat en ordre intéressant
• Soit il faut ajouter une phase de tri
• Le nombre maximum de résultats est donné par
– Le produit des cardinalités des relations impliquées (FROM) • Un plan à i-1 relations n’est combiné avec une relation
• Le facteur de réduction (FR) associé à chaque terme supplémentaire que si il existe
représente l’impact de ce terme sur la réduction de la taille du – une condition de jointure entre le résultat et la relation supplémentaire
résultat – des prédicats restant dans la clause WHERE doivent être évalués
– Cardinalité du résultat = Nb max de tuples * produits des FR – i.e., les produits cartésiens sont évités au maximum…
• Les plans candidats sont obtenus en joignant une relation de
plus à la fois • Bien que réduisant l’espace de recherche, cette approche est
– Le coût de la jointure et l’estimation de la cardinalité de la jointure toujours exponentielle en fonction du nombre de relations
donnent à la fois une estimation du coût du plan et une estimation de la
cardinalité du résultat (utilisant FR) impliquées…
69 70
55

Unité d’optimisation : le bloc de requête Optimisation des requêtes imbriquées


• Une requête SQL est parsée sous forme d’un bloc • Chaque bloc imbriqué (interne) est optimisé indépendamment
– Le tuple externe est considéré comme un critère de sélection
– Ex. SELECT Nom FROM Visites V
WHERE V.id IN ( SELECT vid FROM Presc P • Le bloc externe est optimisé en prenant en compte le coût
Bloc externe
WHERE P.vid = V.id ); Bloc interne d’appel au bloc interne
– Le coût d’appel au bloc interne peu être cher…
• Les blocs internes sont traités comme une fonction imbriquée
– Sub-routine lancée une fois par tuple du bloc externe • L’ordonnancement des blocs est déterminé par la requête SQL
– NB : simplification extrême, en fait ça n’est pas complètement vrai… – Evidement, peut donner lieu à un plan d’exécution sous optimal
– La version ‘plate’ d’une requête imbriquée est (très) généralement bien
mieux optimisée…
• Pour chaque bloc, les plans considérés sont Exemple classique de requête imbriquée
– Tous les chemins d’accès, pour chaque relation du FROM que l’on peut (doit) éviter ?

– Tous les plans linéaires gauches


• i.e., toutes les façons de joindre les relations du FROM l’une après l’autre,
c’est-à-dire toutes les permutations possibles et tous les algo. de jointure
71 72
Optimisation des requêtes imbriquées Conclusion sur System R
• Chaque bloc imbriqué (interne) est optimisé indépendamment
– Le tuple externe est considéré comme un critère de sélection • Optimisation des requêtes mono table
– Tous les chemins d’accès sont considérés
• Le bloc externe est optimisé en prenant en compte le coût • Optimisation des requêtes multi tables
d’appel au bloc interne
– Tous les plans mono table sont d’abord énumérés
– Le coût d’appel au bloc interne peut être cher…
• Les projections et sélections sont appliquées au plus tôt
– Ensuite, tous les choix de jointure possible avec une relation
• L’ordonnancement des blocs est déterminé par la requête SQL
supplémentaire (en tant que relation interne) sont examinés
– Evidement, peut donner lieu à un plan d’exécution sous optimal
• Pour chaque paire de relations
– La version ‘plate’ d’une requête imbriquée est (très) généralement bien
– Est conservé le plan dont le coût est le plus faible
mieux optimisée…
Exemple classique de requête imbriquée SELECT nom
– Et en plus les plans présentant un résultat ordonné de façon
que l’on peut (doit) éviter ? FROM Docteur D ‘intéressante’
WHERE D.id IN ( SELECT V.docid
SELECT nom FROM Visite V); – Le processus continue jusqu’à avoir impliqué les N relations
FROM Docteur D, Visite V
WHERE D.id = V.docid;
73 74
56

Conclusion générale

• L’optimisation de requête est une tache cruciale du SGBD

• Les 2 phases majeures de l’optimisation


– Considérer un ensemble de plans candidats
• L’espace doit être réduit (ex. arbres linéaires gauche dans System R)
– Le coût de chaque plan considéré doit être estimé
• Estimation de la taille du résultat et du coût de chaque nœud

• Le DBA doit comprendre l’implication du design de la base


(schéma, index) sur l’optimisation d’un jeu de requêtes…
dans Oracle
Slides empruntés à Pascale Borlat Salamet – Oracle France

75 76
77 78
57

79 80
81 82
58

83 84
85 86
59

CF = le nombre de pages que l’on CF = le nombre de pages que l’on


accède si l’on suit les pointeurs de accède si l’on suit les pointeurs de
l’index dans l’ordre l’index dans l’ordre

Index plaçant, quel est le CF ? Index non plaçant, quel est le CF ? Index plaçant, quel est le CF ? Index non plaçant, quel est le CF ?

Ici, 2 (sans les ‘…’) 3

87 88
Sélectivités obtenues avec une hypothèse uniforme ?

11 1
0 0
0-25 25-50 50-75 75-100

5
Valeur = rouge

Valeur = bleu Valeur = jaune


3 tuples

0 100 tuples 200 300 Max tuples

89 90
60

91 92
Procedures stockées / Fonctions / Triggers
On reprend le TD sur les Triggers avec les commandes, dont les tables sont CLIENT,
PRODUIT, COMMANDE et ACHAT. On souhaite complémenter l'application SGBD en
rajoutant un package permettant de gérer les commandes, plutôt que de passer directement par
des insertions dans le SGBD.

On complémente cette base avec une autre table annexe appelée


COMMANDE_FOURNISSEUR et qui correspond aux commandes passées par l'entreprise.
On suppose que lorsqu'on place une commande auprès du fournisseur, celui-ci est capable de
nous expédier tout ce qu'on souhaite (simplement il ne l'expédie pas tout de suite).

On souhaite réaliser des procédures ou fonctions permettant de :


- Augmenter de X% le prix de l'article le plus vendu.
- Faire une ristourne de X% sur une commande.
- Faire une ristourne de X% sur toutes les commandes d'un client.
- Commander un produit au fournisseur à 80% du prix qu'on souhaite le vendre (= insérer
dans la table COMMANDE_FOURNISSEUR)
- Commander tous les produits manquants de la base au fournisseur.
- Mettre en rayon (= mettre à jour la table PRODUIT) une commande du fournisseur. Il
faudra aussi effacer cette commande de la table COMMANDE_FOURNISSEUR.
Réfléchissez à comment gérer les commandes en attente (cf TD sur les Triggers). On pourra
par exemple définir une procédure prenant comme paramètre une commande, et qui essaie de
la traiter compte tenu du stock (on ne met donc pas de triggers dans ce cas). Vous créerez
également une procédure qui effectuera ce traitement pour toutes les commandes, en gérant en
priorité les commandes des plus "gros" clients de l'entreprise.
- On complémente la base par une table INVENTAIRE qui correspond exactement à la
structure de la table produits. On suppose que cette table peut être remplie à la main lors d'un
inventaire physique. On souhaite ensuite réaliser une procédure permettant de créer une table
PRODUITS_PERDUS avec exactement la même structure que la table PRODUITS et qui
donne le nombre de produits perdus ou volés, et affiche à l'écran le coût total des pertes.
- On complémente la base par une table VENDEURS(vendeurID, nom, salaire, bonus) et une
table VENDS (vendeurID, produitID) où chaque vendeur est en charge d'un nombre
équivalents de produits (répartis aléatoirement). Réalisez le trigger permettant de remplir
automatiquement la table VENDS lorsqu'on insère un nouveau VENDEUR. Que pensez-vous
de ne pas mettre de trigger, et mettre à la place une procédure qu'on appellera de temps en
temps ?
- Réalisez une procédure permettant de calculer le bonus de chaque vendeur, qui est de 1% *
somme totale des produits vendus par le vendeur. Après un inventaire, on déduit de la prime
du vendeur les pertes / vols. Il faut également prendre en compte le fait que les primes sont
payées mensuellement, et l'inventaire est fait une fois par an.

61
TRIGGERS
Exercices d'application

BASE PRODUITS

On considère une base de produits, construite à partir de la structure exemple fournie (scripts
MySQL). Les tables sont CLIENT, PRODUIT, COMMANDE et ACHAT. Lorsqu'une
commande passe du statut termine = 0 à termine = 1, on souhaite la recopier dans la table
ACHAT en indiquant le prix du jour, et réduire le stock du nombre d'éléments commandés...
mais attention il faut en avoir assez en stock !

Note: vous pourrez utiliser les instructions


DBMS_OUTPUT.PUT_LINE('blabla'); pour l'affichage
RAISE_APPLICATION_ERROR (-20001, ‘erreur XXXX’); pour interrompre l'exécution et
lancer une erreur.

Questions :

1- Avec un CHECK simple : on peut protéger la table de telle sorte que la valeur de stock ne
puisse pas être négative. Proposez une solution, et discutez les inconvénients. Faut-il utiliser
une transaction ?

2- Entraînement au trigger : ajoutez un trigger interdisant de baisser le prix d'un article.

3- Ecrivez un trigger permettant de réaliser la contrainte proposée dans l'énoncé : si on ne peut


pas réaliser la commande, alors on l'annule intégralement et on l'efface de la base.

4- On souhaite améliorer notre trigger pour que si on n'a pas assez de produits en stock, alors
on va envoyer tous ceux restants au client. La commande reste telle qu'elle dans la base, mais
l'achat devra prendre en compte cette modification de quantité.

Problème de Table Mutante

Construisez la base suivante (ou chargez le script)

CREATE TABLE CLIENT2(


IDC INTEGER PRIMARY KEY ,
NOM VARCHAR2 (40));

CREATE TABLE VOYAGE(


IDV INTEGER PRIMARY KEY ,
DESTINATION VARCHAR2 (40),
MAXPLACE INTEGER ) -- nombre total de places disponibles
;

CREATE TABLE INSCRIPTION(


IDC INTEGER REFERENCES CLIENT2(IDC),
62
IDV INTEGER REFERENCES VOYAGE(IDV),
DATERESERV DATE ,
CONSTRAINT INSCRIPTION_PK PRIMARY KEY (IDC, IDV));

INSERT INTO CLIENT2(IDC, NOM) VALUES (1, 'DURAND');


INSERT INTO CLIENT2(IDC, NOM) VALUES (2, 'DUBOIS');
INSERT INTO CLIENT2(IDC, NOM) VALUES (3, 'DUGENOU');
COMMIT ;

INSERT INTO VOYAGE(IDV, DESTINATION, MAXPLACE) VALUES (10, 'VENISE',


1);
INSERT INTO VOYAGE(IDV, DESTINATION, MAXPLACE) VALUES (11, 'PRAGUE',
2);
COMMIT ;

Lors de l'exécution d'une requête de ce type :

INSERT INTO INSCRIPTION(IDC, IDV, DATERESERV) SELECT 3, 10,


TO_DATE(SYSDATE, 'DD/MM/YYYY') FROM DUAL ;

On souhaite vérifier que le nombre de voyages réservé n'est pas encore atteint ! Notez que si
on écrit directement un trigger sur la table INSCRIPTION on court de risque de tomber sur
une table mutante ...

On utilise la vue suivante :

CREATE OR REPLACE VIEW V_INSCRIPTION AS SELECT * FROM INSCRIPTION;

Question :

1- En utilisant la vue V_INSCRIPTION, écrivez un trigger utilisant INSTEAD OF qui va


permettre de correctement faire respecter cette contrainte. Il faudra bien entendu faire
l'insertion via la vue et non plus directement via la table.

2- En utilisant plusieurs triggers et une table temporaire pour transmettre les informations,
réalisez la même fonctionnalité. Dans ce cas, la commande d'insertion sera faite sur la table
INSCRIPTION.

63
TD-TP DE BASES DE DONNEES
PRELIMINAIRES
Mise en place
Connectez-vous sur la machine oracle.ens.uvsq.fr (ex : ssh oracle.ens.uvsq.fr)
Tapez votre mot de passe
Démarrez SQL*Plus par la commande : sqlplus / (attention sqlplus <espace> <slash>). Vous
êtes prêts à travailler.

SQL*PLUS
SQL*PLUS est l'interface de base d'Oracle. Elle est composée des commandes de SQL et de
SQL*PLUS. Les commandes SQL permettent de définir et manipuler les données. Les
commandes SQL*PLus permettent de formater les résultats, établir des options, éditer et
stocker les commandes SQL, …

Quelques commandes SQL*PLUS indispensables…


SET pause ON/OFF : permet d'effectuer un défilement page par page de l'écran.
SET LINESIZE 132 : permet d'augmenter le nombre de caractères par ligne
SET PAGESIZE 60 : permet d'augmenter le nombre de lignes par page
SET TIMING ON : donne le temps de calcul de chaque commande SQL
HELP <commande> : help, aide sur une commande SQL.
@ <NomFichier> : exécute le fichier NomFichier.sql qui doit se trouver dans le répertoire de
lancement de SLQ*PLUS
! : sortie sous unix (temporaire, SQL*PLUS est en background)

64

Page - 1 1
TD-TP DE BASES DE DONNEES
TD1 : CREATION / MODIFICATION DU SCHEMA / INSERTION
Il s'agit de construire le schéma de la base. Nous nous intéresserons dans la suite du TP à
une sous partie du schéma concernant les commandes.

Table client : CLI (CodeCli, NomCli, Pays)


Table commande : COM (NumCom, CodeCli, FraisPort, AnCom);
Table détail commande : DET (NumCom, NumProd, Qte, Remise)
Table produit : PROD (NumProd, NomProd, TypeProd)

Code du client : CodeCli, Frais de port : FraisPort, Remise effectuée : Remise,


Nom du client : NomCli, Année de commande (ex 1992) : AnCom, Nom du produit : NomProd,
Pays du client : Pays Numéro de produit : NumProd, Type de produit : TypeProd
Numéro de la commande : NumCom, Quantité : Qte,

1. Dessiner sur papier le schéma de la base en faisant ressortir les clés primaires (en
souligné) et étrangères (en souligné et pointillé)
2. Créer les relations de la base ci-dessus (pensez aux clés primaires et étrangères)
Attention : créer les références sans l’option « on delete cascade »
3. Y a-t-il un ordre à respecter lors de la création de ces tables, si oui lequel ? Pourquoi ?
4. Vérifier vos créations : sous SQL*plus : Utiliser la commande : desc <nomtable>
5. Modifier un type précédemment défini : NomCli devient char(30).
6. Ajouter un attribut Téléphone (Tel) pour les clients
7. Ajouter le prix unitaire (PrixUnit) pour les produit
8. Rajoutez une contrainte de non nullité à l'attribut NomProd
9. Insérer un jeu de données cohérent dans vos relations (un ou deux tuples par relation)
10. Essayez l'interface d'Oracle Express (cf. Navigateur d'objets)

Exemple : create table PROD (


NumProd number(5) constraint Cle_Pro primary key,
NumFour [number(2)] constraint Prod_Ref_Four references FOUR,
Nom char(20) constraint NomProd_Not_Null not null);
Les types disponibles sont : number(n), char(n), date, number(m,n)
Faire attention à la cohérence de type des attributs de jointures (même domaine).
Consulter la liste des types sur le manuel Oracle.
Modifier le type des attributs : ALTER TABLE <nom table> MODIFY ( <attr> newtype, …)
Ajouter un attribut à une relation : ALTER TABLE <nom table> ADD ( <newattr> type, …)
Problème des Valeurs Nulles : Un attribut d'une table déclaré "not null" doit
nécessairement être renseigné lors de l'insertion d'un tuple.

11. Mettre en majuscule les noms des clients (fonction UPPER)


12. Multiplier par deux les remises associées aux commandes passées après 1996
13. Supprimer les clients français
14. Supprimer les clients qui ont commandé avant65 1991
15. Vider toutes vos tables. Y a-t-il un ordre à respecter ? Si oui, pourquoi ?
16. Supprimer toutes vos tables. Y a-t-il un ordre à respecter? Si oui, pourquoi ?
Page - 2 2
Récupérer les fichiers suivants : CREATE.sql, CLI.ctl, COM.ctl, DET.ctl, PRO.ctl, FOUR.ctl

17. Exécuter chaque ordre de CREATE.sql


18. Charger les cinq relations avec SQL loader (à partir d’un terminal). (syntaxe : sqlldr
login/pwd chemin_fichier_point_ctl chemin_fichier_output_point_log)

Remarque : le format du fichier peut poser problème (caractère de fin de chaîne différent entre
Windows/Linux). Il peut donc être nécessaire de modifier les fichiers et de les sauver à
nouveau sous Linux.

19. Y a-t-il un ordre à respecter lors du chargement des relations, si oui pourquoi…
20. Vérifier que vous avez l'intégralité des données : 91 Clients, 1078 Commandes, 2809
Détails, 77 Produits et 29 Fournisseurs. Il vous en manque encore ?
a. Vérifier les logs créés lors du chargement (exemple : more fichier_output.log)
b. Trouvez le problème et résolvez-le (le cas échéant en rechargeant les données
corrigées après les avoir supprimées).

Exemples :
LOAD DATA (Charger des données)
INFILE * (les données se trouvent dans ce fichier)
APPEND (On veut les ajouter dans la table….)
INTO TABLE CLI (c’est dans la table CLI)
FIELDS TERMINATED BY "," OPTIONALLY ENCLOSED BY ‘”‘
(Attention ‘”‘  quote/guillemet/quote)
(champs terminés par des ;)
(… encadrés éventuellement par des " )
(CodeCli,NomCli,Pays,Tel) (liste des attributs indiqués ci-dessous)
BEGINDATA (les données commencent après cet inst°)
1, Maria,Pologne,4867427275 (1er tuple codecli = 1, nomcli = Maria, etc.)
2,"Ana",Autriche","4905219433" (2ème tuple….)
3,"Antonio","Espagne","7062001573" (3ème tuple …)

66

Page - 3 3
TD-TP DE BASES DE DONNEES
TD2 : INTERROGATION SQL

Répondez aux questions suivantes en interrogeant votre base :


Charger le schéma et la base de données en lançant le script CLEAN.sql.
1. Quelle est la liste des clients ?
2. Quelle est la liste des clients français triés par ordre alphabétique ?
3. Quels sont les noms des clients français ou anglais ?
4. Quelle est la liste des produits vendus à "Antonio" ?
5. Quelle est la liste des fournisseurs de produits coutant de moins de 50 euros ?
6. Quels sont les fournisseurs qui fournissent à la fois des produits de moins de 50 euros
et des produits de plus de 400 euros ?
7. Quels sont les noms des clients ayant commandé en 1992 ou 1993 ?
8. Quels sont les fournisseurs qui fournissent le produit ‘Chef’ le moins cher ?
9. Quels sont les noms des fournisseurs qui fournissent le produit ‘Chef’ le moins cher ?
10. Pour chaque fournisseur, quelle est la liste des produits fournis par ordre alphabétique ?
11. Quels sont les fournisseurs qui sont clients (même nom) ?
12. Quels sont les fournisseurs qui ne fournissent que des produits de moins de 50 FF ?
13. Quels sont les fournisseurs qui ne fournissent aucun produit de moins de 50 FF ?
14. Quels sont les fournisseurs qui fournissent tous les produits de moins de 50 FF ?
15. Quels sont les noms des clients qui n'ont jamais passé de commande ?
16. Quels sont les couples de numéros de clients différents ?
17. Quel est le nombre de produits dans la base ?
18. Quels sont les prix moyen et maximum des produits pour chaque type ?
19. Même question mais seulement pour les types où il y a plus de 10 produits.
20. Quelle est pour chaque client, la liste des produits commandés et leur nombre pour
l'ensemble des commandes passées ?
21. Quel est, pour chaque ligne de commande, le prix total à payer (penser à la remise et
à la quantité) ?
22. Quel est le total à payer par commande ?
23. Quel est le total à payer par client ? 67
24. Quels sont les clients qui ont commandé pour plus de 10000 euros ?

Page - 4 4
TD-TP DE BASES DE DONNEES
TD3 : PROGRAMMATION SQL – PL/SQL DANS ORACLE
L’objectif de cette partie est de créer des fichiers PL/SQL et SQL Forms (fichiers de type nom_fichier.sql) que vous
déclencherez avec la commande @nom_fichier dans SQL*Plus. Ces fichiers peuvent à terme être intégrés au serveur
sous forme de procédures stockées.

Questions préliminaires et prise en main


Créer une table RESULTAT ayant la structure suivante : RESULTAT (CODE number, MESSAGE char(50)) et
compléter le programme PL/SQL suivant :
PROMPT Nombre de lignes a produire
ACCEPT n
DECLARE
x NUMBER:= ????????;
BEGIN
FOR i IN 1..&n LOOP
IF MOD(x,???????? ) = 0 THEN
-- x is even
INSERT INTO RESULTAT VALUES ( ?????????????);
ELSE
INSERT INTO RESULTAT VALUES (?????????????);
END IF;
x := x ????????????? ;
END LOOP;
COMMIT;
END;
/
Le programme doit remplir la table RESULTAT avec les valeurs suivantes :
CODE MESSAGE
---- ------
1 100 is odd
2 101 is even
3 102 is odd … etc

Q1 : Bloc PL/SQL, expression conditionnelle


On se place dans le cas du schéma considéré dans la partie précédente avec quelques variantes. Charger les scripts
CREATE-bis.sql et CREATE-bis-data.sql. Visualiser les tables créés et écrire un programme PL/SQL qui :
a) demande le nom d’un client
b) insère un tuple dans la table RESULTAT et le visualise. Ce tuple est tel que :
• s'il n'y a pas de commandes pour ce client, il a comme valeur 'pas de commande'
• sinon, il a comme valeur 'n commandes pour le client X', avec n le nombre de commandes pour le client.
Q2 : Bloc PL/SQL, curseurs et boucles
Ecrire un programme qui permette d’afficher les nième et n+1ième commandes (numéro de la commande, date, et prix
total) les plus récentes, et d’insérer les informations correspondantes dans la table RESULTAT. Le prix total de la
commande sera calculé à partir des détails de cette commande et des prix des produits commandés. Le nombre n est
un paramètre saisi par l’utilisateur.
Q3 : Bloc PL/SQL, curseurs paramétrés
Ecrire un programme qui utilisera un curseur paramétré et qui permette de vérifier que le montant payé
(COM.Payement) d’une commande donnée (renseignée par l’utilisateur) est égal à la somme des lignes de
commandes correspondantes. Pour la commande demandée, une ligne sera insérée dans la table résultat. Cette ligne
aura la forme suivante : « NumCom : 100 - Payement : 5000 – Prix : 5000 »
Q4 : Bloc PL/SQL, clauses FOR UPDATE et CURRENT OF
Ecrire un programme qui identifie les commandes antérieures à une date donnée (entrée en paramètre) pour
lesquelles le payement est différent du prix total de la commande tel qu’escompté (obtenu d’après les lignes de
commandes correspondantes). Pour ces commandes, modifier le payement pour qu’il soit égal au prix total escompté.
Vous utiliserez la clause FOR UPDATE pour assurer le verrouillage des lignes à modifier.
Q5 : Bloc PL/SQL, exceptions
Compléter le fichier de commandes obtenu à la question 8 pour gérer l’erreur survenant dans le cas où le nombre N
serait strictement supérieur au nombre de commandes dans la table Commandes. Dans ce cas, un message d’erreur
sera inséré dans la table résultat.
Q6 : Bloc PL/SQL, packages
Ecrire le package comportant une procédure de tri des clients dans l’ordre décroissant de leur montant total de
commandes qui fournit la liste triée des identifiants clients 68 et du montant total de leurs commandes dans la table
résultat, et une fonction qui renvoie l’identifiant du client ayant le montant de dépenses le plus élevé.

Page - 5 5

Vous aimerez peut-être aussi