Chapitre2-Optimisation Requêtes SQL
Chapitre2-Optimisation Requêtes SQL
Chapitre2-Optimisation Requêtes SQL
Prof : A. BENMAKHLOUF
Introduction
Le temps d’exécution d’une requête SQL dépend d’une part de la structure avec laquelle les
opérations algébriques sont écrite et d’autre part du mode d’accès aux données. L’optimisation
est donc une opération avec laquelle plusieurs plans d’exécution sont examiné dans l’objectif
est de sélectionner celui qui un coût minimum. Ce coût dépend du temps d’exécution et du
nombre de ressources utilisées. Il se mesure en nombre d’entrée-Sortie.
1
Filière : Licence Génie Informatique
Prof : A. BENMAKHLOUF
Plusieurs SGBD comme Oracle et MySQL possèdent des fonctions permettant d'effectuer ces
calculs, via un optimiseur.
d- Traduction Algébrique :
Produire une expression algébrique équivalente à la requête SQL.
Soit la requête-1 suivante qui donne la liste des films commencent au Multiplex à 20 heures ?
2
Filière : Licence Génie Informatique
Prof : A. BENMAKHLOUF
SELECT Séance.IDfilm
FROM Cinéma, Salle, Séance
WHERE Cinéma.nom = 'Multiplex' AND
Séance.heure-début = 20 AND
Cinéma.ID-cinéma = Salle.ID-cinéma AND
Salle.ID-salle = Séance.ID-salle
Soit la requête-2 suivante qui donne la liste des films des réalisateurs ‘Scorsese’ et ‘Spielberg’
projetés au Multiplex à 20 heures ?
3
Filière : Licence Génie Informatique
Prof : A. BENMAKHLOUF
L’objectif principale de l’optimiseur est d’appliquer ces règles pour restructurer (réécrire) la
requête afin de réduire le coût. Un algorithme de restructuration simple peut être donné par :
4
Filière : Licence Génie Informatique
Prof : A. BENMAKHLOUF
Pour l’exemple-2 :
Initiale : idfilm, annee (nom = 'Multiplex' heure-début = 20 (réalisateur=' Scorsese' V réalisateur='Spielberg ') (((Cinéma
⨝ Salle) ⨝ Séance) ⨝ film)
Optimisé : idfilm, annee (((nom = 'Multiplex'(Cinéma) ⨝ Salle) ⨝ heure-début = 20(Séance)) ⨝
réalisateur=' Scorsese' V réalisateur='Spielberg '(film))
5
Filière : Licence Génie Informatique
Prof : A. BENMAKHLOUF
L’optimisation par réécriture algébrique est nécessaire mais pas suffisante. Il faut prendre en
considération d’autres critères comme le mode d’accès aux données, la complexité de
l’algorithme utilisés pour réaliser la jointure et les propriétés statiques de la BDD.
Une base de données est constituée, matériellement, d’un ou plusieurs fichiers stockés sur un
support non volatile. Le support le plus couramment employé est le disque dur qui présente un
bon compromis en termes de capacité de stockage, de prix et de performance. Les disque SSD
(Solid State Drive), dont les performances sont nettement supérieures mais à des prix élevés,
sont de plus en plus utilisé. Au cours des traitements, les données concernées sont chargées
dans les mémoires principales volatiles et très rapides mais de taille très limitée : mémoire vive
et cache. Les données traitées peuvent être archivées dans des mémoires tertiaires permanentes
de grande capacité de stockage mais de faible vitesse.
6
Filière : Licence Génie Informatique
Prof : A. BENMAKHLOUF
La mémoire secondaire est divisée en pages (ou blocs) de taille égale constituées de même
nombre de secteurs1 contigus. La page est l'unité d'échange entre les mémoires secondaire et
principale. Ainsi le coût des opérations dans les BDD est évalué principalement par le nombre
de lectures/écritures de pages c.-à-d. accès au disque.
Les données sur disque sont stockées dans des fichiers. Chaque fichier occupe plusieurs pages
sur disque et l'accès est géré par le système de gestion de fichiers du système d'exploitation. Un
fichier est identifié par son nom.
Un fichier stocke un ensemble d'articles (enregistrements, n-uplets, lignes). Un article est une
séquence de champs ou attributs. Il existe deux types d'articles :
- Articles en format fixe : la taille de chaque champ est fixée
- Articles en format variable : la taille de certains champs est variable.
Les articles sont stockés dans des pages, en général taille article < taille page, et l’adresse d’un
article (ROWID) est composé de l’adresse page plus l’indice de l'article dans la page.
1
Un secteur représente la plus petite surface d’adressage
7
Filière : Licence Génie Informatique
Prof : A. BENMAKHLOUF
La structure d’un bloc est identique quel que soit le type d’information qui y est stocké. Elle est
constituée des cinq parties suivantes :
▪ L’entête (header) contient l’adresse du bloc, et son type (données, index, etc.);
▪ Le répertoire des tables donne la liste des tables pour lesquelles des
informations sont stockées dans le bloc ;
▪ Le répertoire des enregistrements contient les adresses des enregistrements du
bloc ;
▪ Un espace libre est laissé pour faciliter l’insertion de nouveaux enregistrements,
ou l’agrandissement des enregistrements du bloc (par exemple un attribut
à NULL auquel on donne une valeur par un update).
▪ Enfin, l’espace des données contient les enregistrements.
Les trois premières parties constituent un espace de stockage qui n’est pas directement dédié
aux données (Oracle le nomme l’overhead). Cet espace « perdu » occupe environ 100 octets.
Le reste permet de stocker les données des enregistrements.
a- Accès Séquentiel :
Données non triées : Dans le cas d’une sélection à un au plusieurs critères on doit, partir du
début du fichier, charger un par un tous les enregistrements en mémoire centrale, et effectuer à
ce moment-là le test sur les critères de sélection. Ceci augmente linéairement le coût de la
recherche en fonction du nombre d’enregistrement (2Complexité O(n)).
Données triées : Si le tableau est trié sur le champ servant de critère de recherche, il est possible
d’effectuer une recherche par dichotomie qui est beaucoup plus rapide. Cet algorithme permet
de diminuer par deux, à chaque étape, la taille de l’espace de recherche. Si cette taille,
initialement, est de n blocs, elle passe à n/2 à l’étape 1, à n/22 à l’étape 2, et plus généralement
à n/2k à l’étape k. Au pire des cas, la recherche se termine quand il n’y a plus qu’un seul bloc à
explorer, autrement dit quand k est tel que n≈2k ce qui implique k ≈ log2(n) (Complexité
2
Le comportement asymptotique du temps d’exécution, lorsque la taille des entrées n tend vers l'infini, et l'on utilise couramment
les notations grand O de Landau.
8
Filière : Licence Génie Informatique
Prof : A. BENMAKHLOUF
O(log(n)). Ce pendant le maintien de l’ordre dans un fichier soumis à des écritures (insertions,
suppressions et mises à jour) est très difficile à obtenir. Le principe de tri pour effectuer des
recherches efficaces est à la source de très nombreuses structures d’index.
Oracle créé systématiquement un index chaque fois que l’on crée une clef primaire (PRIMARY
KEY) ou une contrainte d’unicité (UNIQUE) sur une table. Les index doivent être utilisés sur
les tables qui sont fréquemment soumises à des recherches.
Les index doivent être utilisés sur les attributs qui sont :
➢ Souvent mobilisés dans une jointure (clé Etrangère)
➢ Très discriminés (c'est à dire pour lesquels peu d'enregistrements ont les mêmes
valeurs)
➢ Rarement modifiés
Un index est donc un fichier structuré dont les enregistrements sont des entrées.
9
Filière : Licence Génie Informatique
Prof : A. BENMAKHLOUF
Supposons que l’on recherche le film Shining. En consultant l’index on constate que ce titre est
compris entre Metropolis et Smoke. On en déduit donc que Shining se trouve dans le même bloc
que Metropolis dont l’adresse est donnée par l’index. Il suffit de lire ce bloc et d’y rechercher
l’enregistrement.
Le coût d’une recherche dans l’index est considérablement plus réduit que celui d’une recherche
dans le fichier principal. D’une part les enregistrements dans l’index (les entrées) sont beaucoup
plus petits que ceux du fichier de données puisque seule la clé (et une adresse) y figure. D’autre
part l’index ne comprend qu’un enregistrement par bloc.
10
Filière : Licence Génie Informatique
Prof : A. BENMAKHLOUF
La recherche par index dense est moins performante de celle dans un index non-dense. En effet
si on cherche une valeur dans un fichier de données (par exemple les films d’une année) il faut
lire dans l’index toutes les adresses correspondant au critère de recherche (tous les films de
l’année), c.-à-d. qu’on peut lire dans plusieurs blocs. Ceci est illustré dans l’exemple précèdent
où on a cherché dans deux blocs pour trouver les films parus en 1992.
Dans un fichier de données on ne peut créer qu’un seul index non dense, si on envisage de trier
un fichier sur la clé primaire, par contre on peut créer plusieurs index denses pour les attributs
faisant fréquemment de critère de recherche.
11
Filière : Licence Génie Informatique
Prof : A. BENMAKHLOUF
Les index multi-niveaux sont très efficaces en recherche, même pour des BDD de très grande
taille. L’inconvenant est, comme toujours, la difficulté de maintenir des fichiers compacts et
triés. L’arbre-B, étudié dans la section qui suit, donne des performances équivalentes à celles
des index multi-niveaux et utilise des algorithmes de réorganisation dynamique qui résolvent
la question de la maintenance d’une structure triée.
12
Filière : Licence Génie Informatique
Prof : A. BENMAKHLOUF
La figure ci-dessous montre un arbre-B indexant notre collection de 16 films, avec pour clé
d’indexation l’année de parution du film.
Contrairement aux fichiers d’index traditionnels, le niveau des feuilles de l’arbre B n’est pas
constitué d’une séquence contiguë de blocs, mais d’une liste chaînée de blocs, ce qui permet de
parcourir ce niveau, en suivant le chaînage. Cette organisation est moins efficace qu’un
stockage continu (le passage d’un bloc à un autre peut entraîner un déplacement des têtes de
13
Filière : Licence Génie Informatique
Prof : A. BENMAKHLOUF
La recherche est effectuée de la même manière que dans un arbre binaire de recherche. Partant
de la racine, on parcourt récursivement l’arbre ; à chaque nœud, on choisit le sous-arbre fils
dont les clés sont comprises entre les mêmes bornes que celles de la clé recherchée. La
difference avec l’arbre binaire c’est que le nœud dans un arbre-B est composé de plusieurs clés.
L’algorithme de Recherche dans un arbre-B qui permet de trouver un clé x dans un nœud est
donnée par :
fonction Recherche(nœud, x)
i=0
tant que i<nœud.taille et x>nœud.clé[i]
i=i+1
si nœud.feuil
si x=nœud.clé[i]
renvoyer clé[i]
sinon si i=nœud.taille
renvoyer « Valeur non trouvée »
FinSi
sinon si i=nœud.taille et x>nœud.cle[i]
Recherche(nœud.branche[i-1], x)
sinon
Recherche(nœud.branche[i], x)
FinSi
14
Filière : Licence Génie Informatique
Prof : A. BENMAKHLOUF
D’une part on insère le nouveau tuple dans la table d’une manière séquentielles, c.-à-d.
l’insertion se fait après la dernière ligne de la table et dans le dernier bloc. Et d’autre part
on insère une nouvelle entrée dans l’index en procédant de la manière suivante :
- On cherche l’endroit où on doit insérer la clé d’indexation (année). On part de
la racine, et on suit les adresses comme si on recherchait dans un arbre de
recherche un enregistrement pour la valeur de clé à insérer.
- Si la feuille où on veut insérer n’est pas pleine (<2k) on ajoute la nouvelle entée
sans porter aucun changement aux nœuds des feuilles internes mais en
maintenant les valeurs triées.
- Si non il y a éclatement du nœud et remontée d’une manière récursive de la clé
médiane au niveau du père.
La figure suivante montre la réorganisation de l’arbre après l’insertion de trois films des
années suivant l’ordre de l’insertion 1988, 1989 et 1987. Nous constatons que l’arbre à
toujours 2 niveaux mais avec une racine plaine.
15
Filière : Licence Génie Informatique
Prof : A. BENMAKHLOUF
On continue la saisie dans la table films en insérant cette fois trois films des années 1999,
1996 et 1997. On constate que ses insertions ont provoqué l’éclatement de la racine et donc
l’ajout d’un autre niveau.
16
Filière : Licence Génie Informatique
Prof : A. BENMAKHLOUF
Prenant l’exemple de la figure précédente, nous allons supprimer du fichier le films Mile, 1996.
Lorsqu’on va supprimer la clé 1996 on va avoir une feuille d’une seule valeur. On fusionne
donc 1995 dans la feuille de droite et on fait descendre la clé 1997. Cette descente va laisser
dans le nveau interne un nœud à une seule valeur 1992 (<k) donc on va le fusionner avec celui
du gauche et on fait descendre la clé 1988 (traitement récursive).
17
Filière : Licence Génie Informatique
Prof : A. BENMAKHLOUF
Hachage statique
Indexé par hachage une table suivant une clé « c » revient à utiliser une fonction (dite de
hachage) qui, pour chaque valeur de clé c, donne l’adresse f(c) d’un espace de stockage où
l’élément doit être placé. En mémoire principale cet espace de stockage est en général une liste
chaînée, et en mémoire secondaire une séquence de blocs sur le disque que nous
appellerons fragment (bucket en anglais).
Chaque fragment est numéroté et a une adresse. Cette dernière est celle de son premier bloc.
Une table de hachage permet d’associer le numéro du fragment à son adresse. C’est donc un
tableau à deux dimensions, avec les numéros dans une colonne et les adresses dans une autre.
Prenons l’exemple de notre ensemble de films, et organisons-le avec une table de hachage sur
le titre. Pour simplifier, on va supposer que chaque fragment contient un seul bloc avec une
capacité d’au plus quatre films. L’ensemble des 16 films occupe donc au moins 4 blocs. Pour
garder un peu de souplesse dans la répartition qui n’est pas toujours uniforme, on va affecter 5
fragments à la collection de films, et on numérote ces fragments de 0 à 4.
Pour affecter un film à l’un des fragments. On utilise une fonction qui, appliquée à un titre, va
donner en sortie un numéro de fragment. Le résultat de la fonction, pour n’importe quelle chaîne
de caractères, doit être un entier compris entre 0 et 4
Nous pouvons utiliser un principe simple pour notre exemple, en considérant la première lettre
du titre, et en lui affectant son rang dans l’alphabet. Ensuite, pour se ramener à une valeur entre
0 et 4, on prendra simplement le reste de la division du rang de la lettre par 5 (« modulo 5 »).
La fonction h sera définie par :
18
Filière : Licence Génie Informatique
Prof : A. BENMAKHLOUF
La figure ci-dessous montre la table de hachage obtenue avec cette fonction. Tous les films
commençant par a, f, k, p, u et z sont affectés au bloc f1. Les lettres commençant par
b, g, l, q et v sont affectées au bloc f2 et ainsi de suite. Notez que la lettre ‘e’ a pour rang 5 et se
trouve donc affectée au bloc 0.
La distribution des adresse générées par une fonction de hachage risque de ne pas être
homogène. En effet une fonction de hachage mal conçus peut engendrer facilement une
surcharge des blocs en affectant la même adresse à plusieurs valeurs de la clé (titre de film).
Dans le pire des cas, une fonction de hachage affecte tous les enregistrements à la même
adresse, et la structure dégénère vers un simple fichier séquentiel.
select *
from Film
where titre = 'Impitoyable'
La function de Hachage appliqué sur la valeur 'Impitoyable' donne 4. On peut donc charger
le fragment 4 et y trouver le film Impitoyable. On a donc pu effectuer cette recherche en lisant
un seul bloc, ce qui est optimal.
Le hachage ne permet pas d’optimiser les recherches par intervalle, puisque l’organisation des
enregistrements ne s’appuie pas sur le tri des clés. La requête suivante par exemple ne peut être
résolue que par le parcours de tous les blocs de la structure, même si trois films seulement sont
concernés.
select *
from Film
where titre between 'Annie Hall' and 'Easy Rider'
Mises à jour
Le hachage statique offre des performances pour les recherches par clé, il est – du moins mal
adapté aux mises à jour. Prenons tout d’abord le cas des insertions : comme on a évoqué avant
les insertions conduisent à dépasser la taille estimée initialement pour les blocs. La seule
solution est alors de chaîner de nouveaux fragments.
Cette situation est illustrée dans la figure ci-dessous. On a inséré deux nouveaux films, Citizen
Kane et Miracle. La valeur donnée par la fonction de hachage est 3.
19
Filière : Licence Génie Informatique
Prof : A. BENMAKHLOUF
h('Citizen Kane’)=3
h(Miracle)=3
On doit donc stocker le film dans l’espace associé à la valeur 3 car c’est là que les recherches
iront s’effectuer. On doit alors chaîner un nouveau fragment au fragment 3 et y stocker le
nouveau film. Il y a donc une dégradation potentielle des performances puisqu’il faudra, lors
d’une recherche, suivre le chaînage et inspecter tous les enregistrements pour lesquels la
fonction de hachage donne la valeur 3.
Hachage dynamique
20
Filière : Licence Génie Informatique
Prof : A. BENMAKHLOUF
Comme Exemple nous prenons toujours la table film et on suppose une fonction de hachage
qui Hache le titre d’un film sur 1 octet. Nous obtenons le tableur de hachage suivant :
Titre h(titre)
Vertigo 01110010
Brazil 10100101
Twin Peaks 11001011
Underground 01001001
Easy Rider 00100110
Psychose 01110011
Greystoke 10111001
Shining 11010011
Tomorow 01110110
Taxi 10110011
Anny 01110001
Nous supposons toujours que les blocs ne peuvent contenir que 4 n-uplet. Dans un premier
temps il y a 8 n-uplet stockés donc nous nous intéressons seulement qu’au premier 0 ou 1. La
figure ci-dessous montre l’insertion des six premiers films de notre liste, et leur affectation à
l’un des deux blocs. Le film Vertigo par exemple a pour valeur de hachage 01110010 qui
commence par 0, et se trouve donc affecté à la première entrée.
Nous effectuons l’insertion de Tomorow, avec pour valeur de hachage 01110110, entraine le
débordement du fragment associé à l’entrée 0.
On va alors doubler la taille du répertoire pour la faire passer à quatre entrées, avec pour valeurs
respectives 00, 01, 10, 11, soit les 22 combinaisons possibles de 0 et de 1 sur deux bits. Ce
doublement de taille du répertoire entraine la réorganisation suivante :
21
Filière : Licence Génie Informatique
Prof : A. BENMAKHLOUF
On insère maintenant « Taxi ». Dans ce cas il aura éclatement du troisième fragment et création
d’un nouveau sans doublé le tableau de hachage, et on répartit les adresses du répertoire pour
référencer les deux fragments
On insère maintenant « Anny ». Il y aura donc éclatement du deuxième fragment en 010 et 011
avec doublement du TH.
En résumé, pour l’indexation par hachage il n’y a que deux cas possibles :
22
Filière : Licence Génie Informatique
Prof : A. BENMAKHLOUF
23
Filière : Licence Génie Informatique
Prof : A. BENMAKHLOUF
Calcul du coût
Le cout de cet algorithme est donné par le nombre totale de pages lus dans le disque. Lorsqu’on
parcoure les n-uplet d’une table dans une boucle :
1. On lit sur disque les pages de la table pour les charger en mémoire
2. On lit en mémoire les articles de chaque page.
On suppose :
- Dans le Disque : Les n-uplets de R sont stockés dans NR pages et ceux de S dans NS
pages
- Dans la Mémoire : 1 pages pour charger les n-uplets de R et 1 pages pour S.
Pour chaque page de R on lit toutes les pages de S et on fait la jointure page par page entre les
articles. S est lue donc NR fois et R une seule fois
C’est le nombre de page de R qui augmente le coût puisque. Il détermine le nombre de fois de
lecture des pages de S. Si les n-uplet de R peuvent être charger dans K pages mémoire, le coût
𝑁
se réduit à : 𝐶 = 𝑁𝑅 + 𝐾𝑅 × 𝑁𝑆 . Et si toutes la table R est charger en mémoire le coût devient :
𝐶 = 𝑁𝑅 + 𝑁𝑆
Conclusion :
La jointure par boucles imbriquées n’est efficace que le cas on a de petites tables pilotes et dans
le cas où l’une des deux tables se charge en mémoire
Exemple1 :
Liste des salles du cinéma id=12
La jointure est réalisée par boucle imbriquée. L’optimiseur accède à la table source « cinema »
pour chercher le cinéma numéro 12. Cette accès se fait par le rowid trouvé par un accès unique
24
Filière : Licence Génie Informatique
Prof : A. BENMAKHLOUF
à l’index sur la clé primaire « cinema.idcinema ». Ensuite l’optimiseur utilise un accès complet
à la table interne « salle » pour trouver les n-uplets correspondant au cinéma numéro 12.
Lorsqu’on crée l’index « indexidcinema » sur la clé étrangère « salle.idcinema », l’optimiseur
accède à la table interne « salle » par lot de rowid. Ces derniers sont trouvés par chargement
d’une rangé de ligne de l’index « indexidcinema » correspondant au numéro 12 (voir plan ci-
dessous).
Exemple-2 :
Afficher le cinéma contenant la salle numéro 124
Cette fois l’optimiseur choisi la table salle comme source de ligne par un accès rowid trouvé
par un accès à l’index sur la clé primaire de salle. Une fois la salle 124 est trouvée le système
cherche le cinéma de cette salle en utilisant l’index sur la clé primaire de cinéma.
25
Filière : Licence Génie Informatique
Prof : A. BENMAKHLOUF
Algorithme boucles-imbriquées
Entrées: tables R, S
Sortie: table de jointure J
début
J=⌽
pour chaque r dans R répéter
pour chaque s dans IndexS.B(r.A) répéter
si r joignable à s alors J := J U {r ⨝ s}
fin répéter
fin répéter
fin
26
Filière : Licence Génie Informatique
Prof : A. BENMAKHLOUF
L’optimiseur utilise la plus petite des deux tables de jointure pour construire une table de
Hachage en mémoire, c’est la phase de construction. Une fois la table de hachage construite,
l’optimiseur scanne la plus grande table. Pour chaque ligne de cette table, il recherche les lignes
jointe de la relation de construction en consultant la table de hachage, c’est la phase de sonde.
Le seul but de la table de hachage est d'agir comme une structure temporaire en mémoire pour
éviter d’utiliser un index pour accéder aux enregistrements de la table source (petite table). Une
table de hachage est une structure de données non ordonnée qui peut mapper des clés à des
valeurs. Ce mappage est réalisé par une fonction de hachage qui transforme chaque clé en un
indice ou un code de hachage. Ce dernier permet un accès direct à l’enregistrement à travers la
clé.
Lors de la construction de la table de hachage, si la taille de cette dernière dépasse la taille
maximale de la mémoire, définie lors de la configuration de cette dernière, l’optimiseur
interrompe cette construction, sonde l’autre table pour ajouter les tuples de jointure, Réinitialise
la table de hachage puis continue à analyser l'entrée de construction de la petite table.
27
Filière : Licence Génie Informatique
Prof : A. BENMAKHLOUF
Entrées: tables R, S, TH
Sortie: table de jointure J (R.A = R.B)
procédure : inserer(TH, s, i) (insérer dans une tableau mémoire TH la structure s dans TH[i] )
Fonction : FH (fonction de hachage)
taille_TH : taille table de hachage
taille_M : Taille mémoire configurer pour la hachage
début
Tantque (r dans R ET taille_TH<taille_M)
inserer(TH, r, FH(R.A))
Fin Tantque
tantque taille_TH > taille_TM
pour chaque s dans S répéter
i :=FH(R.B)
J := J U {TH(i) ⨝ s}
fin répéter
Tant que (r dans R ET taille_TH<TM) répéter
inserer(TH, r, FH(R.A))
Fin Tantque
Fin Tantque
Si r n’est plus dans R Alors
pour chaque s dans S répéter
i :=FH(R.B)
J := J U {TH(i) ⨝ s}
fin répéter
FIN Si
28
Filière : Licence Génie Informatique
Prof : A. BENMAKHLOUF
Tant qu’on c’est la fin de R et la taille de la table de hachage est inférieur à la mémoire réservée.
Ajouter le tuple r à la table de Hachage
Tant que la taille de la table de hachage est égale à la mémoire réservée.
1. Scannez l'entrée de la table sonde et ajoutez des tuples de jointure
2. Réinitialiser la table de hachage et continuer à analyser l'entrée de construction
Si on arrive à la fin du tableau
1. Scannez l'entrée de la table sonde et ajoutez des tuples de jointure
correspondante à la relation de sortie
Exemple :
Nous voulons afficher les cinémas dont le nom commence par « M » avec leurs salles.
La figure ci-dessous montre les deux phases de la jointure par hachage : Etape de construction
et la phase de sonde
Le plan d’exécution donné par l’optimiseur d’oracle est par la figure ci-dessous.
29
Filière : Licence Génie Informatique
Prof : A. BENMAKHLOUF
Calcul du coût
On suppose que :
- Dans le Disque : Les n-uplets de R sont stockés dans NR pages et ceux de S dans NS
pages
- Dans la Mémoire : K pages pour charger les n-uplets de R pour construire la table
de hachage.
𝑁
Par conséquent le coût est : 𝐶 = 𝑁𝑅 + 𝐾𝑅 × 𝑁𝑆 . Si tous les n-uplets de R peuvent être charger
dans la mémoire le coût de réduit à 𝐶 = 𝑁𝑅 + 𝑁𝑆
Conclusion :
La Jointure par hachage est plus efficace que la jointure par boucles imbriquées dans le cas où
les deux tables sont de grande taille.
L’inconvénient du hachage c’est qu’il n’est appliqué que pour la jointure avec égalité
Les VMs restent, par conséquent, un moyen très simple pour répliquer et dupliquer les données
d’une base de données dans d’autres base de données stockées dans des sites distants. Dans ce
cas les mises à jour des opérations d’écriture seront effectuées en différé c-a-d les écritures
seront validées dans la base de données où on a réalisé ces écritures avant d’être validées dans
les sites distants.
30
Filière : Licence Génie Informatique
Prof : A. BENMAKHLOUF
- Les VMs sur rowid. Utile lorsque la vue ne contient pas de (ou pas toutes les colonnes
de la) clé primaire
FAST : mise-à-jour partielle de la copie locale. C’est la méthode la plus efficace, elle utilise
des journaux spécifiques traçant les modifications de la table maître. Lorsque des changements
sont effectués sur les données des tables maîtres, Oracle stocke les lignes qui dérivent ces
changements dans le journal de vue matérialisée (fichiers Log), et utilise ensuite ces
changements dans le journal de vue matérialisé pour réactualiser les vues matérialisées par
rapport à la table maître. Un journal de vues matérialisées est un objet de schéma qui enregistre
les modifications apportées à une table de base afin qu'une vue matérialisée définie sur la table
de base puisse être actualisée de manière incrémentielle. Chaque journal de vues matérialisées
est associé à une seule table de base. Le journal des vues matérialisées réside dans la même
base de données et le même schéma que sa table de base.
31
Filière : Licence Génie Informatique
Prof : A. BENMAKHLOUF
Figure-4 : Rafraichissement d’une VM en utilisant une journalisation stockée dans un fichier Log.
with Rowid, Primary key: inclure la colonne de clé primaire et le rowids de toutes les lignes modifiées de la table
de base dans un journal de vues matérialisées
Liste Attributs : la liste des attributs de la table qui sont utilisés par la requête de la VM
Including new values: permet à la BDD d’enregistrer, dans le journal des VMs, à la fois les anciennes et les
nouvelles valeurs pour les opérations de mise à jour LMD. Concerne une table sur laquelle vous disposez d'une
vue agrégée matérialisée à table unique
• La vue matérialisée ne doit pas contenir de références à des expressions non répétitives
telles que SYSDATE et ROWNUM.
• La vue matérialisée ne doit pas contenir de références RAW ou LONG RAW de types de
données.
• Il ne peut pas contenir de SELECT sous-requête de liste.
• Il ne peut pas contenir de fonctions analytiques (par exemple, RANK) dans la SELECT clause.
• Il ne peut pas contenir de MODEL clause.
• Il ne peut pas contenir de HAVING clause avec une sous-requête.
• Il ne peut pas contenir des requêtes imbriquées qui ont ANY, ALL ou NOT EXISTS.
• Il ne peut pas contenir de [START WITH …] CONNECT BY clause.
• Il ne peut pas contenir plusieurs tableaux détaillés sur différents sites.
• La vue matérialisée à la validation ne peut pas avoir de tables de détails distantes.
• Les vues matérialisées imbriquées doivent avoir une jointure ou un agrégat.
Conditions pour appliquer un rafraîchissement rapide sur les VMs avec jointures
uniquement
32
Filière : Licence Génie Informatique
Prof : A. BENMAKHLOUF
La définition de requêtes pour des vues matérialisées avec des jointures uniquement et sans
agrégats a les restrictions suivantes sur l'actualisation rapide :
Conditions pour appliquer un rafraîchissement rapide sur les VMs avec agrégation
La définition de requêtes pour des vues matérialisées avec des agrégats ou des jointures a les
restrictions suivantes sur l'actualisation rapide :
33
Filière : Licence Génie Informatique
Prof : A. BENMAKHLOUF
• Pour les vues matérialisées avec CUBE, ROLLUP, groupes de regroupement ou concaténation
de celles-ci, les restrictions suivantes s'appliquent :
o La SELECT liste doit contenir un identificateur de regroupement qui peut être
soit une GROUPING_IDfonction sur toutes les GROUP BYexpressions,
soit GROUPINGune fonction pour chaque GROUP BYexpression. Par exemple, si
la GROUP BYclause de la vue matérialisée est " GROUP BY CUBE(a, b)",
la SELECTliste doit contenir soit " GROUPING_ID(a, b)" soit
" GROUPING(a) AND GROUPING(b)" pour que la vue matérialisée puisse être
actualisée rapidement.
o GROUP BY ne doit pas donner lieu à des regroupements en double. Par
exemple, " GROUP BY a, ROLLUP(a, b)" n'est pas actualisable rapidement
car il en résulte des regroupements en double " (a), (a, b), AND (a)"
Exemple :
with Rowid, Primary key : inclure la colonne de clé primaire et le rowids de toutes les lignes
modifiées de la table de base dans un journal de vues matérialisées
Il existe cependant des cas où la seule méthode d'actualisation disponible pour une vue
matérialisée déjà créée est l'actualisation complète car la vue matérialisée ne satisfait pas aux
conditions spécifiées ci-dessous pour une actualisation rapide (consulter
https://docs.oracle.com/cd/B19306_01/server.102/b14223/basicmv.htm)
34
Filière : Licence Génie Informatique
Prof : A. BENMAKHLOUF
Restrictions sur l'actualisation rapide sur les vues matérialisées avec jointures
uniquement et sans agrégats
Quelques Restrictions sur l'actualisation rapide des vues matérialisées avec des agrégats
FORCE : Cette méthode effectue dans un premier temps une actualisation rapide (FAST). Si
cette dernière échoue, une actualisation complète se produira.
35
Filière : Licence Génie Informatique
Prof : A. BENMAKHLOUF
seq number
) ;
begin
dbms_Mview.explain_Mview(‘NomVM’);
end;
• DBMS_MVIEW.REFRESH
• DBMS_MVIEW.REFRESH_ALL_MVIEWS
• DBMS_MVIEW.REFRESH_DEPENDENT
36
Filière : Licence Génie Informatique
Prof : A. BENMAKHLOUF
Actualisez toutes les vues matérialisées qui dépendent d'une table principale ou
d'une vue matérialisée ou d'une liste de tables principales ou de vues
matérialisées spécifiées.
FOR UPDATE: permet de mettre à jour la copie locale (les changements sont propagés aux
tables maîtresses).
37
Filière : Licence Génie Informatique
Prof : A. BENMAKHLOUF
• Cardinality est une estimation a priori du nombre de lignes remontées par la requête à
ce stade (exemple : le nombre de lignes remontées par la jointure est de 874).
• Operation : Le nom de l’opération que peut effectuer l’optimiseur pour joindre les
tables (ex : ‘NESTED LOOPS’, ‘HASH JOIN’ ou MERGE JOIN).
• Option : représente le mode pour accéder aux objets consultés. On note les modes
38