X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=bd%2Fbd05.xhtml;h=9ff0195a28674826d63f418f2a9af6b6977426b8;hb=HEAD;hp=7b0692e0ea72a96a747f9e5e2cbf1f1bb47d8fc9;hpb=171bd61f3e4cf06638c6a90fdc053efbec9623ff;p=hacks%2FsimpleWebSlides.git diff --git a/bd/bd05.xhtml b/bd/bd05.xhtml index 7b0692e..9ff0195 100644 --- a/bd/bd05.xhtml +++ b/bd/bd05.xhtml @@ -42,7 +42,7 @@ - +

Bases de données

Polytech Paris-Sud

@@ -90,7 +90,7 @@ pages
  • Reserves: 40 octets/enr., 100 enr/page, 1000 pages
  • -
  • Boats: non utilisé dans la suite
  • +
  • Boats: 20 octets/enr., 200 enr/page, 200 pages
  • @@ -100,7 +100,7 @@ annotés avec un algorithme particulier.

    @@ -116,9 +116,9 @@

    @@ -127,15 +127,15 @@

    Plan alternatif 1 (sans index)

    On pousse la sélection sous la jointure (car - selection AND). On suppose qu'on a 100 + sélection AND). On suppose qu'on a 100 bateaux, 10 notes et distributions uniformes.

    @@ -260,13 +260,13 @@ Exemples de facteurs de réduction:

    Autres équivalences

    Cas mono-relation

    Dans le cas mono-relation (i.e. sans jointure), la requête est - composée forcément de selections, projections et aggrégats + composée forcément de sélections, projections et agrégats (max, count, average, …)

    1. Pour chaque sous-terme, on considère tous les accès possibles @@ -304,15 +304,15 @@ Une projection commute avec une selection qui utilise uniquement

      Estimation du coût pour les plans mono-relation

        -
      • Si on a un index I pour une selection sur clé primaire : +
      • Si on a un index I pour une sélection sur clé primaire : Hauteur(I) + 1 pour un arbre B+, 1.2 pour un hash-index
      • Si on a un index I groupant pour plusieurs - selection σ1, …, σn :
        + sélection σ1, …, σn :
        (NPages(I) + NPages(R))* RF(σ1) * … * RF(σn)
      • Si on a un index I non-groupant pour plusieurs - selection σ1, …, σn :
        + sélection σ1, …, σn :
        (NPages(I) + NEnr(R))* RF(σ1) * … * RF(σn)
      • Scan séquentiel à R: NPages(R)
      • @@ -343,7 +343,7 @@ Une projection commute avec une selection qui utilise uniquement

        Requêtes multi-relations

        • Les choix vont être guidé par les jointures
        • Si on considère uniquement n jointures (pas de projections ni - de selections dans le plan de requête). Le nombre de plans possible + de sélections dans le plan de requête). Le nombre de plans possible est le nombre d'arbre binaires ayant n noeuds internes (exponentiel en n, exactement: nombre de Catalan d'indice n). Beaucoup trop pour les énumérer tous. @@ -355,7 +355,7 @@ Une projection commute avec une selection qui utilise uniquement

        Ce ne sont que des heuristiques pour réduire l'espace de - recherche, on n'est pas sur d'avoir la solution optimale!

        + recherche, on n'est pas sûr d'avoir la solution optimale!

      Énumération des plans gauches en profondeur 1/2

      @@ -375,24 +375,226 @@ Une projection commute avec une selection qui utilise uniquement deux à deux les résultats de la passe (n-1)
    -

    Comment sélectionner les « meilleurs » jointures - ? On garde pour chaque ordre de - résultat intermédiaire celle de moindre coût +

    Comment sélectionner les « meilleures » jointures ? + On garde pour chaque ordre de + résultat intermédiaire celle de moindre coût

    Énumération des plans gauches en profondeur 2/2

    -

    Exemple: si on a la possibilité de faire une jointure itérative de - cout 1000, une jointure par hash de coût 500 et une jointure - sort-merge de coût 1500, on garde les version hash - et sort-merge (car il est possible que le fait d'avoir les - résultats déjà trié rendent le coût moindre à l'étape suivante) +

    Points à prendre en compte pour le calcul du coût d'un plan

    +
      +
    1. Éviter les plans qui génèrent des produits cartésiens, sauf si + c'est indispensable
    2. +
    3. Les projections, sélections, et jointures itératives par index + peuvent êtres faites en pipeline (ou streaming sans + itération/matérialisation des résultats intermédiaires +
    4. +
    5. Cela peut valoir le coup d'utiliser un merge-sort join + (possiblement coûteux) si on demande les résultats dans un certain + ordre (ORDER BY compatible avec celui de la jointure). Cela évite de faire + une jointure suivie d'un tri. +
    6. +
    7. Pousser les sélections/projections plus bas dans le plan + permet de faire diminuer la taille des résultats + intermédiaires. Attention cependant, appliquer une sélection ou une + projection à une table T munie d'un index crée une table T' plus + petite mais sans + index. +
    8. +
    +
    +
    +

    Exemple

    +

    Considérons la requête :

    + + SELECT sname, bname FROM Boats B, Sailors S, Reserves R WHERE + B.bid = R.bid AND S.sid = R.sid AND S.rating > 8 + +

    Deux jointures (B &join; R et R &join; S) et une +sélection sur S. On suppose un hash-index sur S.sid et un +hash-index sur B.bid, les valeurs de notes vont de 1 à 10, +uniformément réparties. Tous les sid et tous les bid sont présents + dans R. + Les hash-index sont non-groupants et de coût + d'accès 2. + Quels sont les plans possibles ?

    +

    +
    + +
    +

    Exemple (Calculs préliminaires)

    + + + +
    + + +
    +

    Exemple (Plan 1)

    +

    + + + +On choisi de faire d'abord une jointure entre B et S (i.e. un produit +cartésien car il n'y a pas de condition de jointure entre ces deux +tables). Puis la jointure de la table résultante avec B sur les +attributs (bid,sid). +

    +

    Manière la plus efficace de calculer S : appliquer la sélection + directement sur S, puis la jointure B &join; + (σ(S)). Pas d'utilisation d'index possible, jointure page + à page (car on génère tout le produit cartésien) : 100 × + (100 + 200) = 30 000 E/S (pages) ou 19 200 000 enr. +

    +

    Puis jointure itérative page à page avec R (pas d'index sur R, pas d'index + sur le résultat précédent qu'on vient de créer en mémoire): + 1 000 × (30 000 + 1000) = 31 000 000 E/S. +

    +

    Coût total: 31 300 000 E/S (les projections sont faites + en pipline à la fin)

    +

    Plan complètement inefficace. On ignorera les plans contenant un + produit cartésien, sauf si c'est le seul moyen de calculer la + requête (SELECT * FROM A, B). +

    +
    + +
    +

    Exemple (Plan 2 v1)

    +

    + + + +On choisi de faire d'abord une jointure entre R et B, sur +l'attribut bid puis jointure du résultat intermédiaire +sur sid.

    + +

    On dispose d'un index sur B.bid. On effectue une + jointure itérative par index : 1000 + 100 000 × 3 : + 301 000 E/S (2 pour le hash-index et 1 pour la lecture des + données depuis l'index). +

    +

    La deuxième jointure peut être faite à la volée (jointure itérative + par index sur S.sid) et la condition de sélection testée à + la volée. Coût total 100 000 × 3 (pour chacun des enregistrement + précédents, on paye un accès d'index + un accès à la ligne + correspondante dans S). +

    +

    Coût total: 601 000 E/S (les projections sont faites en pipline à la fin)

    +
    + +
    +

    Exemple (Plan 2 v2)

    +

    + + + +On choisi de faire d'abord une jointure entre R et B, sur +l'attribut bid puis jointure du résultat intermédiaire +sur sid.

    + +

    On n'utilise pas l'index sur B.bid. On effectue une + jointure itérative page à page : 200 + 200 × 1000 : + 200 200 E/S . On a 100 000 résultats (car tous les B.bid + sont présents dans la table R). Un enregistrement du + résultat fait environ 40+20 = 60 octets donc 66 enregistrements par + pages de 4000 octets donc 1515 pages de résultats. +

    +

    On applique la sélection sur S par un scan linéaire: 500 + E/S et 100 pages de résultats

    +

    On fait une jointure page à page des deux résultats + précédents : 100 + 100 × 1515 = 100 615 E/S. +

    +

    Coût total: 102 630 E/S (les projections sont faites en pipline à la fin)

    +
    + + + +
    +

    Exemple (Plan 3)

    +

    + + + +On choisi de faire d'abord une jointure entre R et S, sur +l'attribut sid puis jointure du résultat intermédiaire +sur bid.

    +

    On applique la sélection sur S par un scan linéaire: 500 + E/S et 100 pages de résultats

    + +

    On effectue une jointure itérative page à page : 100 + 100 × 1000 : + 100 100 E/S . On a 100 000 résultats (car tous les S.sid + sont présents dans la table R, même après sélection car + distribution uniforme). Un enregistrement du + résultat fait environ 40+50 = 90 octets donc 44 enregistrements par + pages de 4000 octets donc 2272 pages de résultats. +

    +

    On fait une jointure page à page des du résultat + précédent avec B : 200 + 200 × 2272 = 454 600 E/S.

    -

    On garde les ORDER BY, GROUP BY, aggrégats, … - pour la fin, en profitant si possible des ordres des résultats faits - par les jointures précédentes

    -

    On évite tant que possible de faire des produits cartésiens (en - poussant les selections par exemple)

    +

    Coût total : 555 200 E/S

    +
    +
    +

    Exemple (conclusion)

    + + + + +

    Requêtes imbriquées