2010-11-25 5 views
1

Dans le système sur lequel je travaille, nous avons vu un SELECT particulier utiliser un scan d'index en cluster, au lieu d'utiliser l'index qui a été créé pour ce SELECT. J'ai regardé les statistiques de l'indice et j'ai constaté qu'ils avaient 26 jours. J'ai mis à jour les statistiques avec FULLSCAN. Maintenant, le SELECT utilise l'index.AUTO_UPDATE_STATISTICS ne parvient pas à mettre à jour les statistiques pour certains index. Pourquoi?

AUTO_UPDATE_STATISTICS a été activé dans cette base de données tout le temps. Pourquoi les statistiques n'ont-elles pas été mises à jour?

En regardant la sortie STATS_DATE() (requête ci-dessous):

SELECT 
    object_name = Object_Name(ind.object_id), 
    IndexName = ind.name, 
    StatisticsDate = STATS_DATE(ind.object_id, ind.index_id), 
    ind.type 
    FROM SYS.INDEXES ind 
    order by STATS_DATE(ind.object_id, ind.index_id) desc 

Je vois que de nombreux indices ont été mis à jour récemment. Certaines grandes tables qui ont des mises à jour de données tous les jours n'ont pas de statistiques mises à jour depuis des semaines.

Comment MSSQL 2005 décide-t-il de mettre à jour les statistiques lorsque AUTO_UPDATE_STATISTICS est activé? La documentation indique:

Une mise à jour des statistiques est lancée chaque fois que les statistiques utilisées dans un plan d'exécution de requête échouent à un test pour les statistiques en cours. . . Presque toujours, les informations statistiques sont mises à jour lorsqu'environ 20% des lignes de données ont changé.

Peut-on faire confiance? Peut-être que ces tableaux sont si volumineux que le «test de statistiques actuelles» est en cours, même si les enregistrements sont insérés quotidiennement.

+0

Je parie que vous le souhaitez, vous utilisiez SQL2K8 pour que vous puissiez changer cet index à un index filtré. –

Répondre

0

est ici un lien vers les détails de l'algorithme dans un Microsoft livre blanc

http://technet.microsoft.com/sv-se/library/cc966419(en-us).aspx#XSLTsection130121120120

Et ce quoted de Erland Sommarskog:

Lorsque vous avez une table vide, autostats premiers coups de pied après 500 lignes. À partir de là, autostats définit lorsque 20% des lignes ont été modifiées . Ceci est une mesure à partir de rowmodctr.

Cela a pour effet que les grandes tables avec une clé de plus en plus monotones où requêtes va à l'encontre du tronc ont leurs statistiques mises à jour beaucoup trop rarement.

Alors que de petites tables où toutes les lignes sont fréquemment mis à jour, ou où ou lignes sont ajoutées et supprimées, leurs statistiques mis à jour très souvent, ce qui peut causer des problèmes de recompilation.

+0

Mon problème est le contraire. Dans une table avec 11 millions d'enregistrements, une colonne a un index non cluster.Cette colonne est int, et est remplie avec 0 dans tous les enregistrements. Notre application a commencé à insérer une poignée d'enregistrements avec des valeurs non nulles. Les statistiques d'index n'ont pas été mises à jour automatiquement. Par conséquent, l'optimiseur a choisi d'utiliser une analyse d'index en cluster. – Jacob

Questions connexes