it-swarm.com.de

sp_updatestats vs Statistiken aktualisieren

Gibt es einen Unterschied zwischen der Aktualisierung der Statistik einer Tabelle mit sp_updatestats Ohne Resample und der Aktualisierung der Tabellenstatistik mit UPDATE STATISTICS Ohne sample options(FULLSCAN,SAMPLE PERCENT,RESAMPLE)

exec sp_updatestats vs Update Statistik Tabellenname

durch Aktualisieren der Tabellen mit sp_updatestats mit dem Standardwert NO werden die Statistiken mit der Standardabtastrate aktualisiert.

in ähnlicher Weise wird beim Aktualisieren der Tabellenstatistik mit UPDATE STATISTICS ohne sample options(FULLSCAN,SAMPLE PERCENT,RESAMPLE) auch die Tabellenstatistik mit Standardabtastung aktualisiert.

Gibt es also einen Unterschied zwischen beiden Methoden? Vermisse ich hier etwas?

pdate :

Ich weiß, dass sp_updatestats Auf allen Tabellen ausgeführt wird, aber mit UPDATE STATISTICS Können wir Statistiken bestimmter Tabellen aktualisieren.

6

Gibt es einen Unterschied zwischen der Aktualisierung der Statistik einer Tabelle mit sp_updatestats ohne Resample und der Aktualisierung der Tabellenstatistik mit UPDATE STATISTICS ohne Beispieloptionen (FULLSCAN, SAMPLE PERCENT, RESAMPLE)?

Zusätzlich zu dem, was bereits von @Gameiswar erwähnt wird, dem anderen Unterschied, den ich mit sp_updatestats Kenne, werden beim Ausführen für alle Datenbanktabellen NUR Statistiken von Tabellen aktualisiert, bei denen mindestens eine Zeile geändert wurde. BOL sagt

Bei festplattenbasierten Tabellen aktualisiert sp_updatestats nur die Statistiken, die basierend auf den rowmodctr-Informationen in der Katalogansicht sys.sysindexes aktualisiert werden müssen, wodurch unnötige Aktualisierungen der Statistiken für unveränderte Zeilen vermieden werden.

Wenn Sie also sp_updatestats ausführen und Statistiken für alle Tabellen wurden aktualisiert Dies ist falsch/irreführend, nur für Tabellen, bei denen mindestens eine Zeile geändert wurde, wurden die Statistiken aktualisiert.

Während Sie mit UPDATE STATISTICS arbeiten, haben Sie eine ganze Reihe von Optionen für die Aktualisierung der Statistiken.

Wenn Sie den Index mit vollständigem Scan oder mit Standardoptionen neu erstellen, werden die Statistiken für diesen Index aktualisiert, sodass Sie die Statistiken nicht erneut erstellen müssen.

PS: Was auch immer der Unterschied sein mag, ich würde sp_updatestats nicht verwenden, da der Mechanismus zum Aktualisieren von Statistiken nicht gut ist. Warum sollte ich Statistiken für Tabellen aktualisieren, wenn sich nur eine Zeile geändert hat und ich 100.000 Zeilen in der Tabelle habe, wird es nur verbrauchen Ressourcen und verursachen mehr Probleme.

BEARBEITEN:

Wenn Sie Statistiken selektiv aktualisieren und sp_updatestas nicht ausführen möchten, verwenden Sie die folgende Abfrage, um veraltete Statistiken herauszufiltern. Diese Abfrage verwendet DMF und funktioniert ab SQL Server 2008 R2 SP2 , SQL Server 2012 Sp1 and above, Kopiert von Erin Stellatos Blog

[~ # ~] Hinweis [~ # ~] : Beachten Sie, dass verschiedene Tabellen unterschiedliche Schwellenwerte haben können und Sie die obige Abfrage für Ihre Datenbanken anpassen müssen . Bei einigen Tabellen kann es in Ordnung sein, zu warten, bis 15% oder 20% der Zeilen geändert wurden. Bei anderen müssen Sie möglicherweise eine Aktualisierung von 10% oder sogar 5% vornehmen, abhängig von den tatsächlichen Werten und deren Versatz.

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;

Wenn Sie all diese Probleme vermeiden möchten, können Sie auch das Ola Hallengren-Update-Statistikskript verwenden, das sich um viele solcher Dinge kümmert.

5
Shanky

Der Code für sp_updatestats ist ziemlich einfach, Sie können es sich ansehen, indem Sie eine Kopie der Datenbank mssqlsystemresource erstellen. Kopieren Sie einfach die MDF- und LDF-Dateien irgendwo hin und hängen Sie sie als Datenbank mit einem anderen Namen an.

Wie in BOL zu sehen ist, nimmt die Anweisung 1 Parameter an, Resample:

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

Ich denke nicht, dass es eine gute Idee ist, die gesamte Prozedur hier zu posten, Sie könnten selbst einen Blick darauf werfen, aber im Grunde ist es eine einfache Prozedur.

Innerhalb der Prozedur werden die Tabellen in der Datenbank durchlaufen, einige grundlegende Überprüfungen durchgeführt, z. B. das Überprüfen, ob der Clustered-Index einer Tabelle nicht deaktiviert ist, und das Überprüfen, ob eine Tabelle ein Hekathon ist (um zu bestimmen, ob die Liste der Statistiken für eine Tabelle sollte aus sys.stats oder sys.indexes gelesen werden), prüft, ob es sich erneut um eine Hekathon-Tabelle handelt, um im Falle einer Hekathon-Tabelle einen vollständigen Scan hinzuzufügen, und führt dann eine einfache UPDATE-STATISTIK aus.

Grundsätzlich wird eine dieser drei Anweisungen für alle Statistiken in Ihrer Datenbank ausgeführt

-- 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

Außer wenn in der Statistik Autostaten deaktiviert sind, wird auch eine NORECOMPUTE -Klausel hinzugefügt

Es gibt also keinen großen Unterschied zwischen dem einfachen Aufrufen eines UPDATE STATISTICS für jede Ihrer Statistiken, wenn die Autostaten nicht deaktiviert sind und sich nicht in speicheroptimierten Tabellen befinden.

Es gibt Unterschiede in der Art und Weise, wie wir sie verwenden.

Sp_updatestats :
sp_updatestats führt UPDATE STATISTICS durch Angabe des Schlüsselworts ALL für alle benutzerdefinierten und internen Tabellen in der Datenbank aus. Wir können SQL nicht bitten, nur Statistiken für einzelne Tabellen/Indizes mit dieser Option zu aktualisieren.

Statistik aktualisieren :
Mit Statistiken aktualisieren können Sie Statistiken PerTable/Index aktualisieren.

Gibt es einen Unterschied zwischen der Aktualisierung der Statistik einer Tabelle mit sp_updatestats ohne Resample und der Aktualisierung der Tabellenstatistik mit UPDATE STATISTICS ohne Beispieloptionen (FULLSCAN, SAMPLE PERCENT, RESAMPLE)?

Wenn 'resample' nicht angegeben ist, aktualisiert sp_updatestats die Statistiken mithilfe der Standardstichprobe.

Wenn für die Aktualisierungsstatistik keine der Beispieloptionen (SAMPLE, FULLSCAN, RESAMPLE) angegeben ist, tastet der Abfrageoptimierer die Daten ab und berechnet standardmäßig die Stichprobengröße.

2
TheGameiswar