J'essaie de déboguer une procédure stockée assez complexe qui se joint à de nombreuses tabls (10-11). Je vois que pour une partie de l'arbre, le nombre estimé de lignes diffère radicalement du nombre réel de lignes - dans le pire des cas, le serveur SQL estime qu'une ligne sera retournée, alors qu'en réalité, 55 000 lignes sont retournées! Je cherche à comprendre pourquoi - toutes mes statistiques sont à jour, et j'ai mis à jour les statistiques avec un FULLSCAN sur plusieurs tables. Je n'utilise aucune fonction définie par l'utilisateur ou aucune variable de table. Autant que je puisse voir SQL Server devrait être capable d'estimer exactement combien de lignes vont être retournées, mais il continue à choisir un plan qui le cas pour effectuer des dizaines de milliers de recherches RDI (quand il s'attend à effectuer seulement 1 ou 2).Comment le serveur SQL calcule-t-il le nombre estimé de lignes?
Que puis-je faire pour essayer de comprendre pourquoi le nombre estimé de lignes est si important?
MISE À JOUR: Ainsi, la recherche au plan que j'ai trouvé un nœud en particulier qui semble suspicous - sa table scan sur une table à l'aide predecate suivante:
status <> 5
AND [type] = 1
OR [type] = 2
Ce prédicat renvoie le tableau entier (630 lignes - la table se scanne elle-même PAS la source de la mauvaise performance) Cependant le serveur SQL a le nombre estimé de lignes à seulement 37. SQL Server continue ensuite à faire plusieurs boucles imbriquées avec ceci sur les recherches RDI, index scans et index cherche. Cela pourrait-il être la source de mon erreur de calcul massive? Comment l'obtenir pour estimer un nombre plus raisonnable de lignes?
Pourriez-vous publier votre définition de table et la requête complète? – Quassnoi
Désolé, mais pas vraiment - c'est trop grand (250 lignes sp + 10 tables). – Justin
Si votre prédicat est exactement comme cela (pas de parenthèses) alors vous pouvez avoir un problème de logique. ET a la priorité sur OU. Devrait être [état] <> 5 ET (type = 1 OU type = 2) – GilaMonster