Bonjour,
Considérant une table incluant les champs suivants :ID_DOC (int)TITRE_DOC (varchar)DTHR_DOC (datetime)En réalité la table comporte de nombreux autres champs, mais inintéressants au regard de ma question (au passage elle est trop grosse, donc consomme beaucoup trop d' i/o, un dégraissage s'impose).
Admettons qu'un index cluster décroissant soit créé sur le champ DTHR_DOC.
Que la table fasse environ 300 000 lignes.
Je m'interroge sur la différences de performances quant aux 2 requêtes suivantes, dont les plans respectifs utilisent chacun l'index cluster.
Requête 1 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 SELECT * FROM matable WHERE predicats ORDER BY DTHR_DOC DESC // usage de l'index cluster
Requête 2 :
La requête 2 montre des performances excellentes comparées à la requête 1.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 SELECT TOP 50 * FROM matable WHERE predicats ORDER BY DTHR_DOC DESC // usage de l'index cluster
Avec Management Studio cela peut se comprendre car la requête 1 doit ramener les 300 000 enregistrements.
Mais cela se confirme au sein d'une application qui procède pourtant en 2 étapes :
a) SQL Execute de la requête
b) Fetch record x 50
L'étape a) pourrait être aussi rapide pour les requêtes 1 et 2, car pour l'étape b) il suffirait à l'optimiseur de suivre l'index cluster dans l'ordre et d'isoler les enregistrements conformes aux prédicats du WHERE.
Visiblement, l'optimiseur, dans le cas de la requête 1, préfère parcourir tous les enregistrements, même si au bout du compte on ne "Fetch" qu'un seul enregistrement.
Vous allez me dire, c'est l'intérêt de la commande TOP.
Ce qui est ennuyeux, c'est qu'elle n'est pas standard, et pour ceux qui utiliseraient un ORM quelconque (je ne suis pas fan...), il est probable que la commande TOP ne sera pas utilisée, au profit d'un Execute classique suivi du nb de fetchs nécessaires.
Si vous avez des éléments complémentaires, ça m'intéresse
Sylvain
Partager