[SQL] performance d'un UPDATE avec l'ordre des clauses dans un WHERE

Je me pose une question: est ce que l’ordre des clauses dans un WHERE a un impact sur les performances d’un UPDATE?

Par exemple, j’ai une table TEST avec un champs FIDX indexé et un champ FNIDX non-indexé.
Si je fais un

est-ce que ça sera plus rapide qu’un

(ou inversement)?

Apparemment c’est le cas pour Oracle (mais j’ai pas pu tester) et je voulais savoir si c’est le cas sur SQL-Server (et d’autres SGBD, à titre de culture personnelle).

Pour Sql Server, ce qui compte surtout, c’est que ta requête soit paramétrée (@y et @x). L’ordre des paramètres n’influe pas (le plan de d’exécution est du même type que pour un select).

:slight_smile: Ca m’étonnerait beaucoup… Source ?

PS : On ne parle pas des clauses de jointure (INNER JOIN ON …) mais bien de la clause WHERE, car là c’est différent (même le résultat n’est pas le même).

Ca doit dépendre du nombre de champs qui matchent dans le premier truc :

si tu as x1 champs qui matchent pour la condition c1 et x2 pour la condition c2, que c1 et c2 sont liés par une conjonction, et que x1 > x2 alors il vaudra peut-être mieux inverser c1 et c2.

(ce n’est qu’une supposition).
(mais le nombre de lignes doit aussi avoir son importance si ça va chercher dans 2 tables différentes (que donc lignes(c1) != lignes (c2))

C’est pas bien sorcier: les conditions ne doivent etre vérifiées ligne par ligne que pour les colonnes non indexées.
Si le sgbd vérifie les conditions dans l’ordre d’apparition dans la requete, dans le cas ou la colonne non indexée est dans la premiere condition, toutes les lignes sont parcourues: si la colonne indexée est en premier, ce parcours n’a lieu que sur un sous-ensemble de la table.

(bien sur, un sgbd intelligent devrait aller regarder dans les conditions si certaines sont indexées et faire son parcours en conséquence. j’ai aucune idée desquels le font ou non.)

C’est justement ça qui me fait tiquer : SQL Server sait faire ça depuis des lustres sur un SELECT (même problématique : on s’intéresse entre autre aux colonnes renvoyées par la requête pour déterminer l’utilisation d’un index). Ca m’étonnerait beaucoup qu’oracle ne le gère pas.

Le système des plans d’exécution transforme la requête en un arbre d’instruction, et l’optimisation de l’ordre d’évaluation des conditions fait partie de ce process.

Le logo en forme d’ambulance sous Toad : ça n’est pas pour rien :wink: