Académique Documents
Professionnel Documents
Culture Documents
2412 Chap06 PDF
2412 Chap06 PDF
Techniques doptimisation
standard des requtes
Loptimisation du SQL est un point trs dlicat car elle ncessite de pouvoir modifier
lapplicatif en veillant ne pas introduire de bogues.
2010 Pearson Education France Optimisation des bases de donnes Laurent Navarro
154 tude et optimisation desrequtes Axe 2
INFO
Au cours de ce chapitre, nous prsentons des variations de notation qui peuvent avoir un
effet sur les performances. L'optimiseur tant assez performant, il transforme automatique-
ment les requtes soumises en la version la plus performante. Nous recourrons des hints
pour empcher ces transformations afin de comparer les notations. L'utilisation de hint n'est
nullement une recommandation, nous le mentionnons titre indicatif de faon que, si vous
excutez ces requtes, vous puissiez reproduire les mmes rsultats que ceux prsents ici.
Comme cela sera expliqu au Chapitre7, section7.1, "Utilisation des hints sous Oracle", il
faut les utiliser en dernier recours et seulement en toute connaissance de cause.
2010 Pearson Education France Optimisation des bases de donnes Laurent Navarro
Chapitre 6 Techniques doptimisation standard des requtes 155
Selon que lcriture dune requte se fasse avec une sous-requte et loprateur IN
ou avec une jointure, limpact sera diffrent. Pour forcer le parcours des tables,
et non seulement celui des index, nous utilisons dans la requte des champs non
indexs (Quantit et Editeur).
Nous allons tester ces requtes avec et sans index sur la colonne Nolivre de la table
cmd_lignes.
create index IS_cmd_lignes on cmd_lignes(nolivre);
2010 Pearson Education France Optimisation des bases de donnes Laurent Navarro
156 tude et optimisation desrequtes Axe 2
Afin de comparer les rsultats entre les bases, nous dsactivons le paralllisme sous
SQL Server au moyen du code option (MAXDOP 1).
Nous navons pas trouv de combinaisons de hints permettant de forcer lutilisa-
tion dune sous-requte tant quil ny a pas dindex. Une fois lindex plac, nous
avons d contraindre son utilisation avec le hint WITH (INDEX(IS_CMD_LIGNES)). En
revanche, nous navons pas russi forcer une jointure pertinente utilisant cet index.
Conclusion : Oracle et SQL Server, grce leur capacit de transformation de
requte volue, excutent les requtes de la mme faon quelle que soit la notation
employe, si aucun hint nest utilis.
Lorsque la transformation nest pas effectue, on constate que la solution base de
jointure est gnralement plus performante.
Au cas o le SGBDR narriverait pas faire la transformation, il est prfrable de
prendre lhabitude dcrire des jointures plutt que des sous-requtes.
Une anti-jointure est une jointure ouverte pour laquelle vous ne slectionnez que les
valeurs non jointes.
Les requtes ci-dessous, permettent de slectionner les livres qui nont jamais t
commands.
2010 Pearson Education France Optimisation des bases de donnes Laurent Navarro
Chapitre 6 Techniques doptimisation standard des requtes 157
Nous allons tester ces requtes avec et sans index sur la colonne Nolivre de la table
cmd_lignes.
create index IS_cmd_lignes on cmd_lignes(nolivre);
2010 Pearson Education France Optimisation des bases de donnes Laurent Navarro
158 tude et optimisation desrequtes Axe 2
Nous allons tester ces requtes avec un index sur la colonne Nolivre de la table
cmd_lignes.
create index IS_cmd_lignes on cmd_lignes(nolivre);
2010 Pearson Education France Optimisation des bases de donnes Laurent Navarro
Chapitre 6 Techniques doptimisation standard des requtes 159
Oracle et SQL Server considrent ces deux critures quivalentes, alors que MySQL
les voit bien diffrentes. On suppose que dans la version utilisant COUNT(*), il
dnombre toutes les occurrences pour tester lgalit 0, alors que la version uti-
lisant EXISTS sarrte la premire occurrence trouve.
MyISAM In Exists
Temps 14,010s 15,340s
Key_read_requests 5243442 5242448
InnoDB In Exists
Temps 7,420s 8,200s
Reads 2606480 5212684
2010 Pearson Education France Optimisation des bases de donnes Laurent Navarro
160 tude et optimisation desrequtes Axe 2
Loptimiseur Oracle dcide de ne pas utiliser lindex. Si nous forons son usage
laide du hint /*+ index(cl is_cmd_lignes)*/, nous notons une amlioration des
performances.
Nous utilisons le hint /*+NO_QUERY_TRANSFORMATION*/ pour empcher la transfor-
mation des sous-requtes en anti-jointures qui ont un temps de rponse de lordre
0,34seconde.
Comme sous Oracle, nous devons forcer lutilisation de lindex avec le hint WITH
(INDEX(IS_CMD_LIGNES)).
Oracle et SQL Server considrent ces deux critures quivalentes, alors que MySQL
les voit diffrentes, lavantage tant loprateur IN sur les deux moteurs de MySQL.
On enseigne, depuis des annes, que lorsquon emploie des sous-requtes corrles
utilisant loprateur EXISTS, il faut retourner une constante (numrique ou texte)
dans la clause SELECT de la sous-requte. Est-ce seulement pour des raisons de clart
ou aussi de performances?
Nous ne documentons pas le dtail des rsultats. On constate que les colonnes retour-
nes dans la sous-requte nont aucun impact sur les performances, alors quelles en
avaient sur danciennes versions dOracle.
Cette pratique de mettre une constante garde cependant tout son sens du point de
vue de la comprhension. Parfois, certains dveloppeurs mettent ici un champ par-
ticulier laissant ainsi croire quil y aurait une sorte de lien possible avec ce champ.
2010 Pearson Education France Optimisation des bases de donnes Laurent Navarro
Chapitre 6 Techniques doptimisation standard des requtes 161
Nous choisissons ici une requte qui empche dappliquer le prdicat de la table
cmd directement la table cmd_lignes et qui ne retourne que 173lignes. En chan-
geant la date, nous testons une autre version qui ramne beaucoup plus de lignes
(132141).
2010 Pearson Education France Optimisation des bases de donnes Laurent Navarro
162 tude et optimisation desrequtes Axe 2
Avec des requtes ramenant peu de lignes, l'avantage est aux expressions sous-
requtes. Avec des requtes ramenant beaucoup de lignes, l'avantage passe la ver-
sion jointure, sauf pour le moteur MyISAM qui a l'air plus l'aise avec l'utilisation
systmatique d'expressions sous-requtes. Seul l'optimiseur de SQL Server adapte
automatiquement son plan d'excution la solution la plus efficace, indpendam-
ment de l'criture. Nous avons donc utilis les hints loop join et merge join pour
effectuer ces tests.
Quand cest possible, les conditions doivent tre places dans la clause WHERE plutt
que dans la clause HAVING qui est value aprs les oprations dagrgation. Cela
permet de profiter dventuels index et rduit le volume traiter durant lopration
dagrgation.
2010 Pearson Education France Optimisation des bases de donnes Laurent Navarro