From: Kim Nguyễn Date: Mon, 10 Feb 2014 10:58:42 +0000 (+0100) Subject: Ajout cours 4. X-Git-Url: http://git.nguyen.vg/gitweb/?p=hacks%2FsimpleWebSlides.git;a=commitdiff_plain;h=1420d1fffe006dda548df75b1d6837f9f802af02 Ajout cours 4. --- diff --git a/bd/bd04.xhtml b/bd/bd04.xhtml new file mode 100644 index 0000000..127462c --- /dev/null +++ b/bd/bd04.xhtml @@ -0,0 +1,392 @@ + +∈"> + ∉"> + + +] + > + + + Optimisation des opérateurs + + + + + + + + + + + + + + + + + + + + +
+

Bases de données

+

Polytech Paris-Sud

+

Apprentis 4ème année

+

Cours 4 : Optimisation des opérateurs

+
kn@lri.fr
+ http://www.lri.fr/~kn +
+ +

Motivation

+
+

Principe d'évaluation d'une requête

+
    +
  1. Parsing de la requête
  2. +
  3. Traduction en arbre + d'opérateurs de l'algèbre + relationnelle (π, + σ, ⨝, … )
  4. +
  5. Optimisation : +
      +
    1. Génération de plans + d'évaluation (en + réordonnant les opérations élémentaires)
    2. +
    3. Estimation du coût de chacun des + plans (en fonction du coût + des opérations élémentaires)
    4. +
    5. Choix du plan le plus efficace
    6. +
    +
  6. +
  7. Évaluation du plan choisi
  8. +
  9. (Éventuellement mise à jour des statistiques)
  10. +
+

Avant de s'intéresser à l'évaluation complète d'une requête, + on étudie l'évaluation des opérateurs et leur coût respectifs

+
+

Algorithmes de jointure

+
+

Jointure naturelle sur une colonne

+

Considérons :

SELECT * + FROM people,role + WHERE people.pid = role.pid; + +

Opéreeation fondamentale utilisée + par toutes les applications BD.
+ L'AR nous dit que R &join; S = σ=(R x + T), mais c'est très inefficace, on veut optimiser ce cas! +

+

On suppose dans la suite M enregistrements dans R, + PR enregistrements/page, N enregistrement dans S, + PS enregistrements/page. +

+

On pose pour les exemples: M=1000, N=500, PR=120, PS=100

+

L'attribut commun est a.

+

Le coût est toujours le nombre d'E/S (en ignorant l'écriture + du résultat)

+
+
+

Jointure itérative simple

+

On effectue une double boucle imbriquée:

+ + for each record r ∈ R do + for each record s ∈ S do + if r.a = s.a then res += r &join; s #jointure élémentaire de + done #2 enregistrements + done + +

Pour chaque enregistrement de la relation externe (R) on + scanne entièrement la relation interne (S)

+

Coût: M + PR * M * N
+ Exemple: 1000 + 120*1000*500 = 60 001 000 E/S!

+
+
+

Jointure itérative page à page

+

On effectue une double boucle imbriquée:

+ + for each page P ∈ R do + for each page Q ∈ S do + res += P &join; Q #jointure entre 2 pages + done # peut être faite de manière simple + done + +

Pour chaque page de la relation externe (R) on + scanne entièrement la relation interne (S)

+

Coût: M + M * N
+ Exemple: 1000 + 1000*500 = 501 000 E/S!
+ Optimisation: mettre la relation la plus petite à + l'extérieur:
+ 500 + 500*1000 = 500 500 +

+
+
+

Jointure itérative avec index

+

On effectue une double boucle imbriquée:

+ + for each record r ∈ R do + for each record s ∈ S where r.a = s.a do + #l'index doit permettre un accès rapide à la colonne a + res += r &join; s + done + done + +

On exploite l'existence d'un index sur l'une des relation pour + en faire la relation interne.

+

Coût: M + PR * M * (coût d'accès index + coût + index ↦ données)
+ Plusieurs variantes: B+-tree/Hash-index, groupant/non-groupant,… +

+
+
+

Jointure par bloc (avec pages bufferisées)

+

On exploite le buffer (de taille B+2 pages, B = 10) de la + manière suivante:

+ + + for each block b of size B ∈ R do + for each page Q ∈ S do + res += b &join; Q #en utilisant la méthode simple + done + done + +

Coût: M + N * ⌈M/B⌉
+ Exemple: 1000 + 500 * 1000/10 = 51 000
+ Variante: blocs sur R et S +

+ +
+
+

Jointure par tri-fusion 1/2

+

Idée: « l'intersection » de deux listes est aisée si les deux + listes sont triées

+ sort R on a as Rs + sort S on a as Ss + r := Rs.next(); #On suppose R et S non vides + s := Ss.next(); #Sinon jointure vide directement + while Rs and Ss are not empty do + while r.a != s.a do #avance jusqu'à trouver la même valeur + while r.a < s.a do + if Rs.hasNext() then r:= Rs.next() else finished + done + while s.a < r.a do + if Ss.hasNext() then s:= Ss.next() else finished + done + done + val := r.a #on prend la liste des enregistrements + #ayant la même valeur d'attribut de jointure + P, Q := empty pages + while r.a = val do P += r; r:= Rs.next() done + while s.a = val do Q += s; s:= Ss.next() done + res += P &join; Q + done + +
+
+

Jointure par tri & fusion 2/2

+

Coût: M·log2 M + N·log2 N + M + N
+ Exemple: 1000* (1+log2 1000) + 500 * + (1+log2 500) = 15492 +

+

Le tri n'est pas toujours nécessaire:

+ +
+
+

Jointure par hachage

+

On choisit une fonction de hachage h et on + partitionne R selon h(r.a) pour obtenir K partitions

+

On + partitionne S selon h(s.a) pour obtenir K + partitions

+

+

K choisi en fonction de la taille du buffer
+ Coût: 2(M+N) + M+N (pourquoi ?)

+
+
+

Jointures généralisées

+ +
+

Autres opérateurs

+
+

Selectivité

+

Taux de sélectivité d'une condition φ (ou d'une + requête) pour une relation donnée:

+

# d'enregistrement + sélectionnés
+ #d'enregistrements

+

Le choix de certains algorithmes dépend de la + sélectivité

+

On ne connait la « vraie » valeur de la + sélectivité qu'après avoir évalué la requête

+

On utilise des statistiques sur les relations pour tenter une + approximation du taux de sélectivité

+
+
+

Statistiques sur les relations

+

Le SGBD concerve, entre autres, les statistiques + suivantes pour chaque relations R:

+ +
+
+

Sélection

+

Sélection simple, égalité avec une constante : Scan ou + Index (si groupant)

+

Sélection simple avec index non groupant : Index + tri des + adresses de pages, parcours ordonné. Très efficace si + l'ensemble des adresses à trier tiens en mémoire

+

Sélection généralisés, deux approches:

+
    +
  1. On choisit une sous-condition (qui concerne le moins de + pages = la plus sélective) et on applique les autres + sous-conditions au résultat intermédiaire
  2. +
  3. Si on a deux sous-conditions « AND » avec 2 indexes (types 2 ou 3) + séparés, calcul des ensembles de rid et intersection + des résultats. On applique ensuite les autres critères. +
  4. +
+
+
+

Résultat trié/élimination des doublons

+

Plusieurs techniques :

+ +
+
+

Projection

+

On parle ici de la projection, π de l'algèbre + relationnelle, donc avec élimination des doublons :

+ SELECT DISTINCT a,b FROM t + + +
+
+

Double partitionnement

+

Repose sur l'utilisation de deux fonctions de hachage + h et g distinctes

+
    +
  1. On partitionne R en K partitions en + utilisant h
  2. +
  3. En suite pour chaque partition entre 1 et K, on crée une + table de hachage en mémoire (avec g comme fonction) + pour pour éliminer les doublons de la partition
  4. +
+

+

Permet d'effectuer « DISTINCT» sans tri!

+
+
+

Opérations ensemblistes

+ +
+
+

Opérations d'agrégat

+ + +
+
+

Conclusion

+

L'algèbre relationnelle est simple (quelques opérateurs pour + exprimer l'ensemble des requêtes)

+

Chaque opérateur peut être réalisé de plusieurs manières + différentes, avec différents compromis

+

Tout celà est encore complexifié quand on considère les + compositions d'opérateurs (prochain cours)

+

Tout est encore plus complexifié si on considère que le SGBD + gère plusieurs requêtes en parallèle (hors programme)

+

En pratique, une part importante du moteur de + requête des SGBD est l'implantation d'heuristiques pour + faire les meilleurs choix (ou plutôt, les moins pires).

+
+ + diff --git a/bd/btree_index_00.svg b/bd/btree_index_00.svg new file mode 100644 index 0000000..0df02f0 --- /dev/null +++ b/bd/btree_index_00.svg @@ -0,0 +1,123 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + diff --git a/bd/btree_index_01.svg b/bd/btree_index_01.svg new file mode 100644 index 0000000..7d5e9da --- /dev/null +++ b/bd/btree_index_01.svg @@ -0,0 +1,168 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + 4 + 19 + 22 + 39 + + diff --git a/bd/btree_index_02.svg b/bd/btree_index_02.svg new file mode 100644 index 0000000..e320a82 --- /dev/null +++ b/bd/btree_index_02.svg @@ -0,0 +1,382 @@ + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + 22 + + + + + + + + + + + + 4 + 19 + + + + + + + + + + 22 + 25 + 39 + + + + + + diff --git a/bd/btree_index_03.svg b/bd/btree_index_03.svg new file mode 100644 index 0000000..e3292a8 --- /dev/null +++ b/bd/btree_index_03.svg @@ -0,0 +1,393 @@ + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + 22 + + + + + + + + + + + + 4 + 19 + + + + + + + + + + 22 + 25 + 39 + + + + + 90 + + diff --git a/bd/btree_index_04.svg b/bd/btree_index_04.svg new file mode 100644 index 0000000..6f9b15e --- /dev/null +++ b/bd/btree_index_04.svg @@ -0,0 +1,558 @@ + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + 22 + + + + + + + + + + + + 4 + 19 + + + + + + + + + + + + + + + 22 + 25 + + + + + + + + + + + + + + 95 + 39 + 90 + + + 39 + + + diff --git a/bd/btree_index_05.svg b/bd/btree_index_05.svg new file mode 100644 index 0000000..7f30c4a --- /dev/null +++ b/bd/btree_index_05.svg @@ -0,0 +1,851 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + 22 + + + + + + + + + + + + 4 + 19 + + + + + + + + + + + + + + + 22 + 25 + + + + + + + + + + + + + + 53 + 39 + 50 + + + 39 + + 60 + 80 + 59 + + + + + + + + + 60 + 71 + + + + + + + + + + + 95 + 80 + 90 + + + + + + + diff --git a/bd/btree_index_06.svg b/bd/btree_index_06.svg new file mode 100644 index 0000000..67963c7 --- /dev/null +++ b/bd/btree_index_06.svg @@ -0,0 +1,971 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + 22 + + + + + + + + + + + 39 + + 60 + 80 + + + + + + + + 4 + 19 + + + + + + + + + + + + 22 + 25 + + + + + + + + + + + + 39 + 50 + + + + + + + + + + + + 60 + 71 + + + + + + + + + + + 95 + 80 + 90 + + + + + + + + + + + + + 59 + 53 + 54 + + + + 53 + + diff --git a/bd/btree_index_07.svg b/bd/btree_index_07.svg new file mode 100644 index 0000000..a2354ef --- /dev/null +++ b/bd/btree_index_07.svg @@ -0,0 +1,1265 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + 53 + + + + + + + + + + + + + 60 + + + + + + + + + + + 80 + + + + + + + + + + + 4 + 19 + + + + + + + + + + + + 22 + 25 + + + + + + + + + + + + 39 + 50 + + + + + + + + + + + + 60 + 71 + + + + + + + + + + + 95 + 80 + 90 + + + + + + + + + + + + + 59 + 53 + 54 + + + + + + + + + + + 22 + + + + + 39 + + + + + + + + + + diff --git a/bd/btree_index_08.svg b/bd/btree_index_08.svg new file mode 100644 index 0000000..b33a681 --- /dev/null +++ b/bd/btree_index_08.svg @@ -0,0 +1,836 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + 22 + + + + + + + + + + + + 4 + 19 + + + + + + + + + + + + + + + 22 + 25 + + + + + + + + + + + + + + 53 + 39 + 50 + + + 39 + + 60 + 80 + 59 + + + + + + + + + 60 + 71 + + + + + + + + + + 80 + 90 + + + + + + diff --git a/bd/btree_index_09.svg b/bd/btree_index_09.svg new file mode 100644 index 0000000..3a5444e --- /dev/null +++ b/bd/btree_index_09.svg @@ -0,0 +1,820 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + 22 + + + + + + + + + + + + 4 + 19 + + + + + + + + + + + + + + + 22 + 25 + + + + + + + + + + + + + + 53 + 39 + 50 + + + 39 + + 59 + 80 + 59 + + + + + + + + 60 + + + + + + + + + 80 + 90 + + + + + + diff --git a/bd/btree_index_10.pdf b/bd/btree_index_10.pdf new file mode 100644 index 0000000..244eaf1 Binary files /dev/null and b/bd/btree_index_10.pdf differ diff --git a/bd/btree_index_10.svg b/bd/btree_index_10.svg new file mode 100644 index 0000000..cd8b9d7 --- /dev/null +++ b/bd/btree_index_10.svg @@ -0,0 +1,736 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + 4 + + + + + + + + + + + 22 + 25 + + + + + + + + + + + + + 53 + 39 + 50 + + + 39 + + 59 + 80 + 59 + + + + + + + + 60 + + + + + + + + + 80 + 90 + + + + + + diff --git a/bd/btree_index_simple.svg b/bd/btree_index_simple.svg new file mode 100644 index 0000000..3e112b5 --- /dev/null +++ b/bd/btree_index_simple.svg @@ -0,0 +1,659 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + 1000 + + + + + + 2000 + + + + + + + 7000 + + + + + + + 1800 + + + 2320 + + + 6000 + + + + 4000 + + + + + + + + + + + + John, 24, 1900Abbey, 40, 3000… + Paul, 37, 5000Frank, 53, 2320Laura, 33, 4000… + + + Mark, 29, 6000Richard, 61, 1800… + + + + + + + + 5000 + 3500 + 3000 + 1900 + + diff --git a/bd/hash_index_01.pdf b/bd/hash_index_01.pdf new file mode 100644 index 0000000..e30b194 Binary files /dev/null and b/bd/hash_index_01.pdf differ diff --git a/bd/hash_index_01.svg b/bd/hash_index_01.svg new file mode 100644 index 0000000..635f7ff --- /dev/null +++ b/bd/hash_index_01.svg @@ -0,0 +1,463 @@ + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + 200011011 + + + + + + + + 2 + 4 + 12 + 32 + 16 + + + + + 2 + 1 + 5 + 21 + + + + + + 2 + 10 + + + + + + + + 2 + 15 + 7 + 19 + + + + + + + diff --git a/bd/hash_index_02.svg b/bd/hash_index_02.svg new file mode 100644 index 0000000..c13b04c --- /dev/null +++ b/bd/hash_index_02.svg @@ -0,0 +1,535 @@ + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + 200011011 + + + + + + + + 2 + + + 32 + 16 + + + + + 2 + 1 + 5 + 21 + + + + + + 2 + 10 + + + + + + + + 2 + 15 + 7 + 19 + + + + + + + + + + 2 + 4 + 12 + 20 + + + diff --git a/bd/hash_index_03.svg b/bd/hash_index_03.svg new file mode 100644 index 0000000..dad4006 --- /dev/null +++ b/bd/hash_index_03.svg @@ -0,0 +1,542 @@ + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + 3000001010011100101110111 + + + + + + + + 3 + + + 32 + 16 + + + + + 2 + 1 + 5 + 21 + + + + + + 2 + 10 + + + + + + + + 2 + 15 + 7 + 19 + + + + + + + + + + 3 + 4 + 12 + 20 + + + diff --git a/bd/hash_index_04.svg b/bd/hash_index_04.svg new file mode 100644 index 0000000..5871382 --- /dev/null +++ b/bd/hash_index_04.svg @@ -0,0 +1,622 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + 3000001010011100101110111 + + + + + + + + 3 + + + 32 + 16 + + + + + 2 + 1 + 5 + 21 + + + + + + 2 + 10 + + + + + + + + 2 + 15 + 7 + 19 + + + + + + + + + + 3 + 4 + 12 + 20 + + + + + + + diff --git a/bd/hash_index_simple.svg b/bd/hash_index_simple.svg new file mode 100644 index 0000000..e927456 --- /dev/null +++ b/bd/hash_index_simple.svg @@ -0,0 +1,232 @@ + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + John, 24, 1900Abbey, 40, 3000…Paul, 37, 5000Frank, 53, 2320Laura, 33, 4000…Mark, 29, 6000Richard, 61, 1800… + h(age) + + + + @p1=h(24)=h(40) + @p2=h(37)=h(53)=h(33) + @p3=h(29)=h(61) + + diff --git a/bd/hash_join.svg b/bd/hash_join.svg new file mode 100644 index 0000000..22bb265 --- /dev/null +++ b/bd/hash_join.svg @@ -0,0 +1,683 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + R + + + + + + + … + + S + + + + + … + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + h + h + partition 1 + partition 2 + partition 3 + partition K + … + + diff --git a/bd/hash_partition.svg b/bd/hash_partition.svg new file mode 100644 index 0000000..f94f877 --- /dev/null +++ b/bd/hash_partition.svg @@ -0,0 +1,607 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + R + + + + + + + … + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + h + partition 1 + partition 2 + partition 3 + partition K + … + + + + + + + + + + g + H + Ajout d'un élément dansH uniquement si absent + + diff --git a/bd/pdf/bd04.pdf b/bd/pdf/bd04.pdf new file mode 100644 index 0000000..5440b35 Binary files /dev/null and b/bd/pdf/bd04.pdf differ diff --git a/bd/pdf/bd04_print.pdf b/bd/pdf/bd04_print.pdf new file mode 100644 index 0000000..c1b9a9f Binary files /dev/null and b/bd/pdf/bd04_print.pdf differ diff --git a/bd/sorted_file_simple.svg b/bd/sorted_file_simple.svg new file mode 100644 index 0000000..7c1020d --- /dev/null +++ b/bd/sorted_file_simple.svg @@ -0,0 +1,337 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + John, 24, 1900Abbey, 40, 3000…Paul, 37, 5000Frank, 53, 2320Laura, 33, 4000…Mark, 29, 6000Richard, 61, 1800… + + AbbeyFrankJohnLauraMarkPaulRichard + + + + + + + + +