J'ai un entrepôt de données de 200 Go dans SQL Server.
J'ai connu des temps d'exécution très lents pour certaines requêtes; par exemple 12 heures pour une simple delete
requête avec un inner join
.
Après avoir fait quelques recherches avec les plans d'exécution, j'ai mis à jour les statistiques des 2 tables impliquées dans la requête, en utilisant l' WITH FULLSCAN
option.
La requête s'exécute maintenant en moins d'une seconde, il semble donc que les statistiques n'étaient pas à jour.
J'envisage de désactiver auto update statistics
la base de données et de l'exécuter UPDATE STATISTICS
manuellement après le chargement de l'entrepôt de données. L'entrepôt de données est chargé de manière incrémentielle à partir d'un système ERP source quotidiennement, la nuit.
Ai-je raison de supposer que auto update statistics
dans un scénario d'entreposage de données, ce n'est pas vraiment utile? Au lieu de cela, est-il plus logique de mettre à jour les statistiques manuellement après le chargement des données?
Réponses:
Voici un livre blanc sur le moment où la mise à jour automatique des statistiques se produit . Voici les points saillants des mises à jour automatiques des statistiques:
@JNK a donc fait remarquer dans un commentaire que si vous avez 1 milliard de lignes dans une table, vous auriez besoin d'avoir 20 000 500 000 écritures dans la première colonne de la statistique pour déclencher une mise à jour.
Prenons la structure suivante:
Maintenant, nous pouvons vérifier pour voir ce qui s'est passé dans les statistiques.
Cependant, pour voir s'il s'agit d'un objet statistique significatif, nous devons:
Cette statistique n'a donc pas été mise à jour. En effet, il semble que la statistique ne soit pas mise à jour jusqu'à ce qu'un
SELECT
se produise et même alors, leSELECT
doit être en dehors de ce que SQL Server a dans son histogramme. Voici un script de test que j'ai exécuté pour tester ceci:Au lieu de désactiver aveuglément les statistiques auto_update, j'essayerais d'examiner votre ensemble de données pour le biais. Si vos données présentent un biais important, vous devez envisager de créer des statistiques filtrées, puis décider si la gestion manuelle des mises à jour des statistiques est la bonne solution.
Pour analyser le biais, vous devez exécuter
DBCC SHOW_STATISTICS(<stat_object>, <index_name>);
(dans le script ci-dessus sans leWITH STAT_HEADER
) sur la combinaison stat / index particulière que vous souhaitez examiner. Un moyen rapide de surveiller votre asymétrie serait de regarder l'histogramme (troisième jeu de résultats) et de vérifier la variance de votreEQ_ROWS
. Si c'est assez cohérent, votre asymétrie est minime. Pour l'intensifier, vous regardez laRANGE_ROWS
colonne et regardez la variance car elle mesure le nombre de lignes entre chaque étape. Enfin, vous pouvez prendre le[All density]
résultat duDENSITY_VECTOR
(deuxième jeu de résultats) et le multiplier par la[Rows Sampled]
valeur duSTAT_HEADER
(premier jeu de résultats) et voir quelle serait l'attente moyenne pour une requête sur cette colonne. Vous comparez cette moyenne à votreEQ_ROWS
et s'il y a beaucoup d'endroits où cela varie considérablement, alors vous avez un biais.Si vous constatez que vous avez une asymétrie, vous devez envisager de créer des statistiques filtrées sur les plages qui sont élevées très élevées
RANGE_ROWS
afin de pouvoir donner des étapes supplémentaires pour de meilleures estimations sur ces valeurs.Une fois ces statistiques filtrées en place, vous pouvez envisager la possibilité de mettre à jour manuellement les statistiques.
la source