web-dev-qa-db-fra.com

sp_updatestats vs Statistiques de mise à jour

Existe-t-il une différence entre la mise à jour des statistiques d'une table en utilisant sp_updatestats Sans rééchantillonnage et la mise à jour des statistiques de la table en utilisant UPDATE STATISTICS Sans sample options(FULLSCAN,SAMPLE PERCENT,RESAMPLE)

exec sp_updatestats vs mise à jour des statistiques nom de table

la mise à jour des tables en utilisant sp_updatestats avec la valeur par défaut NO mettra à jour les statistiques avec le taux d'échantillonnage par défaut.

de même, la mise à jour des statistiques de table en utilisant UPDATE STATISTICS sans sample options(FULLSCAN,SAMPLE PERCENT,RESAMPLE) mettra également à jour les statistiques de table avec un échantillonnage par défaut.

Y a-t-il donc une différence entre les deux méthodes? Suis-je en train de manquer quelque chose ici?

Mise à jour:

Je sais que sp_updatestats Fonctionne sur toutes les tables mais en utilisant UPDATE STATISTICS Nous pouvons mettre à jour les statistiques d'une table spécifique.

6
Pரதீப்

Existe-t-il une différence entre la mise à jour des statistiques d'une table à l'aide de sp_updatestats sans rééchantillonnage et la mise à jour des statistiques de la table à l'aide de UPDATE STATISTICS sans options d'échantillon (FULLSCAN, SAMPLE PERCENT, RESAMPLE)

Ajoutant à ce qui est déjà mentionné par @Gameiswar, l'autre différence que je connais avec sp_updatestats, lorsque vous l'exécutez pour toutes les tables de la base de données, il met à jour UNIQUEMENT les statistiques des tables dont au moins une ligne a été modifiée. BOL dit

Pour les tables sur disque, sp_updatestats met à jour uniquement les statistiques qui nécessitent une mise à jour en fonction des informations rowmodctr dans la vue de catalogue sys.sysindexes, évitant ainsi les mises à jour inutiles des statistiques sur les lignes inchangées.

Ainsi, lorsque vous exécutez sp_updatestats et qu'il est indiqué les statistiques de toutes les tables ont été mises à jour ceci est incorrect/trompeur uniquement pour les tables dont au moins une ligne a été modifiée, les statistiques ont été mises à jour.

En allant avec UPDATE STATISTICS, vous avez beaucoup d'options à utiliser pour la mise à jour des statistiques.

De plus, lorsque vous reconstruisez l'index avec une analyse complète ou avec des options par défaut, les statistiques sont mises à jour pour cet index, donc pas besoin de reconstruire à nouveau les statistiques pour celui-ci.

PS: Quelle que soit la différence, je n'utiliserais pas sp_updatestats car le mécanisme qu'il utilise pour mettre à jour les statistiques n'est pas bon, pourquoi devrais-je mettre à jour les statistiques de la table si une seule ligne a changé et que j'ai 100 000 lignes dans la table, elle consommera simplement ressources et causer plus de problèmes.

MODIFIER:

Si vous souhaitez mettre à jour les statistiques de manière sélective et ne souhaitez pas exécuter sp_updatestas, utilisez la requête ci-dessous pour filtrer les statistiques obsolètes. Cette requête utilise DMF et fonctionnerait à partir de SQL Server 2008 R2 SP2 , SQL Server 2012 Sp1 and above, Copié de le blog d'Erin Stellato

[~ # ~] note [~ # ~] : réalisez que différentes tables peuvent avoir des seuils différents et vous devrez ajuster la requête ci-dessus pour vos bases de données . Pour certaines tables, attendre que 15% ou 20% des lignes soient modifiées peut être correct. Mais pour d'autres, vous devrez peut-être mettre à jour à 10% ou même 5%, selon les valeurs réelles et leur asymétrie.

SELECT [sch].[name] + '.' + [so].[name] AS [TableName] ,
[ss].[name] AS [Statistic],
[sp].[last_updated] AS [StatsLastUpdated] ,
[sp].[rows] AS [RowsInTable] ,
[sp].[rows_sampled] AS [RowsSampled] ,
[sp].[modification_counter] AS [RowModifications]
FROM [sys].[stats] [ss]
JOIN [sys].[objects] [so] ON [ss].[object_id] = [so].[object_id]
JOIN [sys].[schemas] [sch] ON [so].[schema_id] = [sch].[schema_id]
OUTER APPLY [sys].[dm_db_stats_properties]([so].[object_id],
[ss].[stats_id]) sp
WHERE [so].[type] = 'U'
AND [sp].[modification_counter] > 0--change accordingly
ORDER BY [sp].[last_updated] DESC;

Si vous voulez éviter tous ces tracas, vous pouvez également utiliser le script de mise à jour des statistiques d'Ola Hallengren qui s'occupe de beaucoup de ces choses.

5
Shanky

Le code pour sp_updatestats est assez simple, vous pouvez le consulter en créant une copie de la base de données mssqlsystemresource. Copiez simplement les fichiers mdf et ldf quelque part et joignez-les en tant que base de données avec un autre nom.

Comme on peut le voir dans [[# #]] bol [~ # ~] l'instruction prend 1 paramètre, rééchantillonne:

ALTER procedure [sys].[sp_updatestats]
    @resample char(8)='NO'
as

Je ne pense pas que ce soit une bonne idée de publier l'intégralité de la procédure ici, vous pouvez y jeter un coup d'œil vous-même, mais en gros c'est une procédure simple.

Dans la procédure, il parcourt les tables de la base de données, effectue des vérifications de base, telles que la vérification d'une table n'a pas son index cluster désactivé, vérifie si une table est hekathon (pour déterminer si la liste des statistiques sur une table doit être lu à partir de sys.stats ou sys.indexes), vérifie s'il s'agit à nouveau d'une table hekathon pour ajouter un balayage complet dans le cas d'une table hekathon, puis exécute une simple MISE À JOUR DES STATISTIQUES.

Fondamentalement, l'une de ces trois instructions est exécutée sur toutes les statistiques de votre base de données

-- When resample is yes
UPDATE STATISTICS [sysname].[sysname] [sysname] WITH RESAMPLE
-- When resample is no
UPDATE STATISTICS [sysname].[sysname] [sysname] 
-- For a hekathon table
UPDATE STATISTICS [sysname].[sysname] [sysname] WITH FULLSCAN

Sauf si les statistiques ont désactivé les statistiques automatiques, il ajoute également une clause NORECOMPUTE

Il n'y a donc pas beaucoup de différence entre simplement appeler un UPDATE STATISTICS sur chacune de vos statistiques si les statistiques automatiques ne sont pas désactivées et ne figurent pas sur des tables optimisées en mémoire.

Il y a des différences dans la façon dont nous les utilisons ..

Sp_updatestats:
sp_updatestats exécute UPDATE STATISTICS, en spécifiant le mot clé ALL, sur toutes les tables définies par l'utilisateur et internes dans la base de données. Nous ne pouvons pas demander à SQL de mettre à jour uniquement les statistiques pour une table/un index unique à l'aide de cette option,

Mettre à jour les statistiques:
Avec Update Statistics, vous pouvez mettre à jour les statistiques PerTable/Index ..

Existe-t-il une différence entre la mise à jour des statistiques d'une table à l'aide de sp_updatestats sans rééchantillonnage et la mise à jour des statistiques de la table à l'aide de UPDATE STATISTICS sans options d'échantillonnage (FULLSCAN, SAMPLE PERCENT, RESAMPLE)

Si 'resample' n'est pas spécifié, sp_updatestats met à jour les statistiques en utilisant l'échantillonnage par défaut.

Pour les statistiques de mise à jour, lorsqu'aucune des options d'échantillon (SAMPLE, FULLSCAN, RESAMPLE) n'est spécifiée, l'optimiseur de requête échantillonne les données et calcule la taille de l'échantillon par défaut.

2
TheGameiswar