Les statistiques de mise à jour automatique ne mettent pas à jour les statistiques

8

Suis à l' aide que SQL SERVER 2012j'ai mon Auto Update Stats ON dans ma base de données.

À partir du lien ci-dessous, j'ai appris que les statistiques de mise à jour automatique se déclencheront pour chaque SQRT(1000 * Table rows)modification des lignes du tableau. https://blogs.msdn.microsoft.com/srgolla/2012/09/04/sql-server-statistics-explained/

J'ai créé une table avec 1000 enregistrements

SELECT TOP 500 Row_number()OVER (ORDER BY (SELECT NULL)) rn,
                name
INTO   stst
FROM   sys.objects 

Création de statistiques

CREATE STATISTICS rn  
    ON stst (rn)  

CREATE STATISTICS name  
    ON stst (name)  

Vérification des statistiques créées

DBCC show_statistics('stst', rn)  -- Rows 500 

DBCC show_statistics('stst', name) -- Rows 500

Selon la formule

select SQRT(1000 * 500) -- 707.106781186548

Donc, si j'ajoute / modifie des 707.106781186548enregistrements dans ma table, les statistiques de mise à jour automatique doivent se déclencher

Ajouter 1000plus d'enregistrements à ma table qui devraient être plus que suffisants pour tirerauto update stats

INSERT INTO stst(rn,name)
SELECT TOP 1000 Row_number()OVER (ORDER BY (SELECT NULL)) rn,
                a.name
FROM   sys.objects a 

Pour tirer le auto update stats

Select * from stst

Vérification des statistiques

DBCC show_statistics('stst', rn)  -- Rows 500 

DBCC show_statistics('stst', name) -- Rows 500

Malheureusement encore l' Rowsest 500seulement.

Même après avoir inséré des 1000enregistrements dans ma table, ce qui est évidemment plus important que 707.106781186548lors de l'exécution SELECTpourquoi les statistiques de mise à jour automatique ne se sont pas déclenchées? Qu'est-ce que j'oublie ici

P ரதீப்
la source
7
Vous manquez quelques choses. Le calcul amélioré n'est utilisé que dans les versions antérieures à 2016 si vous avez activé l'indicateur de trace 2371. Les statistiques ne sont pas mises à jour lorsque les données sont modifiées, elles sont mises à jour après la modification des données et une requête doit les utiliser (en supposant qu'elles ont atteint le seuil de modification).
Erik Darling
7
Une requête triviale (par exemple SELECT * sans clause WHERE) ne déclenchera pas de mise à jour des statistiques. Essayez d'exécuter une requête qui fait réellement que le moteur fasse quelque chose où les statistiques peuvent être utiles (par exemple, égalité ou plage sur la colonne clé principale).
Aaron Bertrand
2
@sp_BlitzErik Merci pour l'info sur Trace Flag ne sait jamais que ..
P ரதீப்
3
Ne vous sentez pas stupide, j'ai appris quelque chose des réponses à votre question. Et je suis d'accord que @sp_BlitzErik et / ou AaronBertrand devraient publier leurs réponses.
SqlZim
8
Je vais laisser @AaronBertrand poster sa réponse. Il pourrait utiliser les points.
Erik Darling

Réponses:

11

Le nouveau calcul n'est utilisé que si l'indicateur de trace 2371 est activé, sauf sur SQL Server 2016 lorsque le niveau de compatibilité de la base de données de contexte est défini sur 130, où il s'agit du comportement par défaut. Voir Microsoft KB 2754171:

Contrôle du comportement d'Autostat (AUTO_UPDATE_STATISTICS) dans SQL Server

Les statistiques ne sont pas mises à jour lorsque les données sont modifiées. Une mise à jour des statistiques est déclenchée lorsque l' optimisation basée sur les coûts constate que les statistiques intéressantes pour la requête sont périmées.

L'optimiseur n'entre pas dans l'optimisation basée sur les coûts pour les requêtes très simples ("triviales"), où un seul plan évident est toujours optimal. Aucune mise à jour des statistiques ne se produit dans ce scénario.

Consultez la mise en cache et la recompilation du plan du livre blanc de Microsoft dans SQL Server 2012 par Greg Low.

Paul White 9
la source