Professional Documents
Culture Documents
SGA
Shared Pool
Buffer Redo
Cache Cache
Dictionary Cache
Library Cache
Control files data files Redo log files Archive init file
Driss HAZZAF 1
Structure physique Base (ORACLE)
TABLESPACE DATAFILE
SEGMENT DB BLOCK
EXTENT OS BLOCK
Driss HAZZAF 2
Paramètres création table (ORACLE)
PCTINCREASE :Le taux d'incrémentation en pourcentage de
l'extent N par rapport à l'extent N- 1 ( Pour N > 2). Si pctincrease est
égal à zéro, alors tous les extents à partir du troisième sont égaux au
deuxième extent.
Driss HAZZAF 3
Paramètres création table (suite)
Exemple:
CREATE TABLE FOURNISSEUR
( NO_FOURNISSEUR NUMBER(10) NOT NULL,
NOM VARCHAR2(100),
PRENOM VARCHAR2(100),
MAIL VARCHAR2(100),
TELEPHONE VARCHAR2(30),
CONSTRAINT FOURNISSEUR_PK PRIMARY KEY(NO_FOURNISSEUR) )
PCTFREE 30
PCTUSED 70
STORAGE
(INITIAL 2K
NEXT 1K
MINEXTENTS 4
MAXEXTENTS 6
PCTINCREASE 50);
Cette table est créée avec un espace de 6.75 k, et sa taille max sera de 15.1875
Driss HAZZAF 4
Paramètres DB Block (ORACLE)
Driss HAZZAF 5
Structure Index B*Tree
Driss HAZZAF 6
Index B*Tree INSERTION
L'insertion d’une clé dans un arbre d’ordre k nécessite les
opérations suivantes :
– Chercher la feuille où la nouvelle clé devrait être insérée.
– Insérer la clé dans la feuille.
– Si le noeud possède plus de 2k clés, on le transforme en deux
nœuds, chacun possédant k clés, et on remonte la clé du milieu
dans le nœud père.
– Le nœud père peut alors posséder trop de fils, le procédé
continue jusqu'à ce que l'on atteigne la racine.
– Si la racine doit être divisée, on remonte la clé du milieu dans
une nouvelle racine, qui aura alors pour fils les deux nœuds
crées à partir de l'ancienne racine.
Driss HAZZAF 7
Exemple Arbre B+
On considère un index de type B+ d’ordre 2 sur
la colonne durée de la table Projet.
Construire l’arbre correspondant à l’insertion des
durées suivantes dans l’ordre indiqué ( ne
mettre dans l’arbre que les clés ) :
(1,9,5,11,43,61,13,23,89,41,119,25,27,29,31)
Driss HAZZAF 8
Solution
Driss HAZZAF 9
Optimisation requêtes SQL
• Le travail d'optimisation d'une requête SQL commence par la génération du plan
d'exécution "EXPLAIN PLAN", ceci permet de connaître les différentes étapes de
l’exécution de la requête (si le système utilise des indexes ou passe par un FULL
SCAN de la table ... )
Pour générer le Plan d'exécution d'une table sous ORACLE il faut :
– Créer la table PLAN_TABLE dans le schéma utilisateur si elle n'existe pas :
Pour créer cette table il faut exécuter le script UTLXPLAN.SQL, il existe dans
"$ORACLE_HOME/RDBMS/ADMIN" sous UNIX ou "%ORACLE_HOME
%/RDBMS/ADMIN" sous Windows.
– Générer le plan d'exécution de la requête SQL avec la commande EXPLAIN
PLAN :
EXPLAIN PLAN FOR
REQUETE_SQL;
– Afficher le plan d'exécution de la requête SQL à partir de la table
PLAN_TABLE.
• Dans un deuxième temps, il faut interpréter le plan d’exécution et revoir le code
SQL de la requête et les indexes des tables s’il le faut.
Driss HAZZAF 10
Optimisation requêtes SQL (Suite)
EXPLAIN PLAN FOR
SELECT P.LIBELLE AS Projet, A.NUMERO_EMPLOYE AS Employé
FROM PROJET P INNER JOIN AFFECTATION_PROJET A
ON P.PROJET_CODE = A.PROJET_CODE
WHERE A.PRIORITE = 1;
Le plan d’exécution de la requête est le suivant :
0 SELECT STATEMENT
1 NESTED LOOPS
2 TABLE ACCESS AFFECTATION_PROJET FULL
3 TABLE ACCESS PROJET BY INDEX ROWID
4 INDEX PROJET_PK UNIQUE SCAN
Le système fait une boucle imbriquée pour la jointure entre les tables AFFECTATION_PROJET et
PROJET. Il commence par une lecture séquentiel de la table AFFECTATION_PROJET pour
chercher les lignes ayant comme priorité 1. Pour chaque ligne, il extrait la valeur de
PROJET_CODE et interroge l’index PROJET_PK de la table PROJET pour récupérer les adresses
des lignes correspondantes dans la table PROJET, puis il récupère La ligne correspondante à
chaque adresse.Enfin le système fait la jointure entre les lignes des deux tables et envoi les libelles
des projets et les numéros d’employés.
Driss HAZZAF 11
Exercices
1. On considère un index de type B+ d’ordre 2 sur la colonne
durée de la table Projet. Construire l’arbre correspondant à
l’insertion des durées suivantes dans l’ordre indiqué, ne
mettre dans l’arbre que les clés :
(1,9,5,11,43,61,13,23,89,41,119,25,27,29,31)
2. Générer et expliquer le plan d’exécution de la requête
suivante :
SELECT P.LIBELLE AS Projet, T.DESCRIPTION AS Tache
FROM PROJET P INNER JOIN TACHE T
ON P.PROJET_CODE = T.PROJET_CODE
WHERE T.PCT_REALISATION = 100;
3. Qu’est-ce que vous pouvez proposer pour optimiser la
requête précédente ?
Driss HAZZAF 12
Solution
1. L’arbre B+ est le suivant :
29
9 23 41 61
159 11 13 23 25 27 29 31 41 43 61 89 119
Driss HAZZAF 13
Solution (suite )
2. Le plan d’exécution de la requête est le suivant :
SELECT STATEMENT
NESTED LOOPS
TABLE ACCESS TACHE FULL
TABLE ACCESS PROJET BY INDEX ROWID
INDEX PROJET_PK UNIQUE SCAN
Le système fait une boucle imbriquée pour la jointure entre les tables TACHE et PROJET. Il commence
par une lecture séquentiel de la table TACHE pour chercher les lignes ayant un pourcentage de
réalisation égal à 100. Pour chaque ligne, il extrait la valeur de PROJET_CODE et interroge l’index
PROJET_PK de la table PROJET pour récupérer les adresses des lignes correspondantes dans la
table PROJET, puis il récupère La ligne correspondante à chaque adresse.Enfin le système fait la
jointure entre les lignes des deux tables et envoi les libelles des projets et les descriptions de tâches.
3. Pour améliorer la requête, on peut ajouter un index sur la colonne PCT_REALISATION de la table
Tache.
Driss HAZZAF 14