2013-07-04 2 views
1

Nous avons récemment rencontré un problème étrange de performances avec SQL Server 2008performances étrange des requêtes en utilisant 'max'

Compte tenu de ces deux requêtes (qui sont équivalentes)

select max(tfiv_value) from tablefieldintvalue where tfiv_fk_tablefield = 48 

et

select max(tfiv_value) from tablefieldintvalue where tfiv_fk_tablefield = 
(select tbfl_pk from tablefield where tbfl_name = 'Field with pk 48') 

Le premier prend environ 20 secondes, tandis que le second prend 0.

ar la sous-requête

(select tbfl_pk from tablefield where tbfl_name = 'Field with pk 48') 

a pour résultat 48.

Nous voyons dans le plan de requête qui transforme la seconde requête en jointure, mais cela ne me explique pas encore pourquoi cette différence de performance se produit. Dans mon esprit, s'il y aurait une différence, la première devrait être plus rapide.

Nous avons un index sur tous les champs pertinents.

+0

Ces minutages sont-ils cohérents? Ou, avez-vous simplement exécuté le premier, notez que cela a pris du temps, puis exécutez le second? –

+0

Ils sont cohérents, la première requête commence à courir un peu plus vite après un certain temps (descend à 6 secondes) mais reste beaucoup plus lente que la seconde. –

Répondre

1

Ma première pensée, cependant, est que la première requête a rempli le cache de la page et la seconde en a simplement profité. La mise en cache peut faire une grande différence.

Si les timings sont si différents (et toujours si) pour les deux requêtes, alors j'imagine que la différence est due à une analyse de table par rapport à l'utilisation de l'index. Vous pouvez vérifier cela en regardant les plans de requête. La question suivante est: "qu'est-ce qui causerait ça?"

La première requête effectue normalement une analyse d'index. . . sauf s'il y a beaucoup, beaucoup de rangées où tfiv_fk_tablefield = 48. Si c'est ce qu'il pensait, alors il pourrait faire une analyse de table au lieu d'une analyse d'index. En d'autres termes, SQL Server dispose d'un optimiseur "intelligent" qui tient compte des statistiques. Et, il pourrait choisir la mauvaise approche lorsque les statistiques sont périmées. Le second peut forcer un scan d'index, car il utilise un type de jointure. Dans ce cas, les statistiques obsolètes n'auront aucun effet et la requête fera le bon choix.

Tout ceci n'est que spéculation. Vous devriez regarder les plans de requête et, si cela est toujours approprié, les inclure dans cette question ou dans une autre.

+0

Je pense que les statistiques étaient vraiment bizarres, après avoir baissé les indices, il a même commencé à aller plus vite. Maintenant, avec de bons indices, les deux requêtes s'exécutent instantanément. Je ne peux pas vraiment dire que je comprends pourquoi, mais merci quand même! –

Questions connexes