Calcul du coût d'une requête

Soit deux relations t1(a:char(8),b:integer) et t2(b:integer) de respectivement 100 et 10 lignes.

Soit la requête SELECT * FROM t1 INNER JOIN t2 ON t1.b=t2.b WHERE t2.b=1.

  • Soit n1 le nombre de tuples tels que b=1 dans t1 ; n1 ∈[0..100]

  • Soit n2 le nombre de tuples tels que b=1 dans t2 ; n2 ∈[0..10]

  • Soit n3 le nombre de tuples tels que t1.b=t2.b ;  : n3 ∈[0..1000]

Question

Il existe plusieurs façons de traduire cette requête en algèbre relationnel, proposer quelques exemples.

Solution

Exemple
  1. Restriction (JointureNaturelle t1,t2), t2.b=1)

  2. JointureNaturelle (Restriction (t2, b=1), t1)

  3. JointureNaturelle (Restriction (t1, b=1), t2)

Question

Calculer le nombre d'instructions de chaque exemple d'expression relationnelle :

  • en considérant que les restrictions sont effectuées par un parcours intégral dans des listes non triées (comme si c'était effectué avec des boucles de type FOR) ;

  • en considérant que chaque opération est effectuée séparément.

Effectuer les calculs pour trois valeurs de n1,n2 et n3 (une valeur minimum, une valeur maximum et une valeur intermédiaire). Donner un intervalle [min..max] indépendant de n1, n2 et n3.

Solution

ExempleRestriction (JointureNaturelle t1,t2), t2.b=1)
  1. JointureNaturelle : 100 x 10 = 1000 instructions ; renvoie n3 tuples

  2. Restriction : n3 instructions

Nombre de tuples renvoyés :

  • Total : 1000 + n3

  • Min(n3=0) : 1000 ; Max (n3=1000) : 2000 ; Exemple (n3=500) : 1500

  • Intervalle : [1000..2000]

ExempleJointureNaturelle (Restriction (t2, b=1), t1)
  1. Restriction : 10 instructions ; renvoie n2 tuples

  2. JointureNaturelle  : n2 x 100

Nombre de tuples renvoyés :

  • Total : 10 + n2 x 100

  • Min(n2=0) : 10 ; Max (n2=10) : 1010 ; Exemple (n2=1) : 110 ; Exemple (n2=5) : 510

  • Intervalle : [10..1010]

ExempleJointureNaturelle (Restriction (t1, b=1), t2)
  1. Restriction : 100 instructions ; renvoie n1 tuples

  2. JointureNaturelle  : n1 x 10

Nombre de tuples renvoyés :

  • Total : 100 + n1 x 10

  • Min(n1=0) : 100 ; Max (n1=100) : 1100 ; Exemple (n1=1) : 110  ; Exemple (n1=5) : 150 ; Exemple (n1=50) : 500

  • Intervalle : [100..1100]

Question

Conclure en indiquant quelle opération nécessite le moins d'instructions.

Solution

Dans (presque) tous les cas les requêtes 2 et 3 sont plus efficaces que 1 (il vaut mieux faire la restriction avant la jointure), le choix entre 2 et 3 dépend de n1 et de n2.

Un cas où il est préférable de faire la jointure avant est par exemple lorsque n3=0 (donc il n'y a aucun tuples à joindre). Notons que le gain est marginal (gain de 10% dans le meilleur des cas).

On en conclut que pour faire le meilleur choix le moteur de requête doit :

  • décider dans quel ordre effectuer les opération relationnelle (ici jointure ou restriction)

  • disposer d'information a priori sur le volume des tables (ici 10 et 100 tuples)

  • disposer d'information a priori sur le résultat des requêtes (ici les valeurs de n1, n2 et n3)