web-dev-qa-db-fra.com

Les rangées estimées plus élevées que réelle malgré la mise à jour des statistiques

J'ai un (anonymisé) plan de requête

Il y a une table (Object8) qui a une variation élevée du nombre de lignes réelles vs en ligne estimée sur deux colonnes (colonne2 et colonne6), ce qui peut être vu dans le match de hachage et les opérateurs de tri

J'ai mis à jour toutes les statistiques sur la table Object8 (ils n'étaient que quelques jours à la date et le tableau ne change pas beaucoup)

Quoi d'autre pourrait être le problème?

2
SEarle1986

Les estimations de cardinalité ne sont que des chiffres. Ils n'ont pas d'importance à moins que vous ayez un problème de performance. Vous indiquez dans votre question qu'il existe une différence entre le nombre réel de lignes et le nombre estimé de lignes à certaines étapes du plan de requête. C'est certainement vrai, mais il est assez rare de voir des plans de requête non triviale pour lesquels des estimations correspondent exactement au nombre réel de lignes. Je ne me concentrerais pas sur une différence de milliers de lignes à moins que vous ayez identifié cette différence pour être la cause première d'une question de performance de la requête.

Examinons la mise à jour des statistiques: pourquoi pourriez-vous voir une estimation de cardinalité inexacte même après la mise à jour des statistiques? Les statistiques ne décrivent souvent pas complètement les données de la colonne. Ils pourraient être échantillonnés, 201 étapes pourraient être insuffisantes pour certains ensembles de données, la densité n'est pas une bonne métrique s'il y a biaisé dans les données, etc. Rejoignez l'estimation de la cardinalité et la combinaison de filtres sur plusieurs colonnes est difficile, même avec des objets de statistiques parfaits car les histogrammes ne sont disponibles que sur une colonne. SQL Server n'a souvent pas d'informations sur le niveau de corrélation entre les colonnes, il doit donc deviner.

Si vous souhaitez en savoir plus, je vous recommande de consulter optimiser vos plans de requête avec l'estimateur de cardinalité SQL Server 2014 de Joe Sack. Voici une citation sur l'une des nombreuses différences entre le CE Legacy CE et la nouvelle CE:

Conditions de jointure multiples

Pour les jointures avec une conjonction des prédicats d'égalité, le CE legacy CE calcule la sélectivité de chaque prédicat d'égalité, suppose l'indépendance et les combine. En revanche, la nouvelle CE estime que la cardinalité de jointure basée sur des fréquences multi-colonnes calculées sur les colonnes de jointure.

Le CES utilise différents modèles. Un modèle peut être un meilleur ajustement que l'autre pour vos données ou même pour une seule jointure. Dans ce cas, il a très peu de choses à voir avec les statistiques. La mise à jour des statistiques ne suffit pas pour aboutir à de bonnes estimations pour tous les cas.

D'autre part, si vous avez une performance spécifique que vous souhaitez aider, vous devrez donner plus d'informations. Je ne vois rien d'alarmer dans le plan de requête que vous avez posté. Quel est le problème de performance que vous avez avec la requête?

1
Joe Obbish