bonjour,
hier soir en parlant avec un anglo-saxon de problèmes de rapidité d'une base de données pas si énorme que ça, il me faisait réviser les principes d'optimisations d'une requêtes SQL dans son écriture pure (donc en considérant la bonne pause des index déjà).
Et là, cette personne m'a sorti de son chapeau anglais une règle que je découvre après 20 ans de SQL sur 4 SGBD (mais pour moi aucune expérience en MS sql server contrairement à lui).
Il m'a appris (ou plutôt m'a dit) que l'ordre de déclaration des éléments dans la clause WHERE devait se faire suivant l'ordre de création des indexs dans la base de données.
Par exemple, si on fait "WHERE a=1 and B=2 and c=3" on a intérêt à ne pas avoir posé l'index A en dernier dans la construction de la base sinon la requête sera plus lente ! cela me paraît être une contrainte technique (voir un défaut) du sgbd plus qu'une règle mais bon...
Moi ça me paraît surtout être une aberration cette règle, mais comme je ne connais pas MS sql server, peut-être que c'est vrai dans ce sgbd là et pas dans d'autres (postgres, mysql par exemple)
qu'en pensez-vous ?
je lui ai demandé des explications, je les aurai dans la soirée.
J'en profite pour remettre à jour mes connaissances. Alors corrigez moi !
Il y a 10 ans en licence info, on nous apprenait que dans une clause WHERE il fallait mettre en premier les conditions qui évacuent le plus de tuples .
Par exemple, dans "where a=1 and b=2 and c=3" il faut impérativement que la condition la plus à gauche "a=1" déliste le plus possible de possibilités de recherche au sgbd et ainsi que la condition la plus à droite (c=3) sert juste au final à affiner la recherche dans ce qui reste.
vrai ou pas encore aujourd'hui ? dans tous les sgbd ?
Ensuite on nous a appris l'inverse (en bac+5), ou plutôt un bémol. ça dépend de si on fait des conditions avec des = ou avec des <>.
Ainsi si on a 'where a<>1 and b<>2 and c<>3", alors il faut que "a<>1" rassemble le moins de tuples possibles .
vrai ou pas ce second principe de bac+5 ! ?
Ensuite est venu l'expérience du métier où j'ai volontairement oublié certaines de ces règles car suivant les sgbd on se rend compte que (en tout cas moi) :
"where a=1 and b=1 and c=1 " est plus long que "where c=1 and b=1 and a=1 " si le champ le plus à gauche possède un type plus complexe que le champ à droite et ce, quel que soit la charge de tuples évacuée.
Par exemple, à gauche il vaut mieux mettre les conditions avec des champs de type INT ou de type BOOLEAN et mettre au plus à droite les conditions avec des champs de type fulltext.
alors en 2012, qu'est-ce qui est encore vrai de toutes ces choses ?
Partager