Wie funktioniert die Stichprobe beim Aktualisieren von Statistiken?

10

Ich habe mehrere massive Tische. Ich möchte über einen wöchentlichen Wartungsplan sicherstellen, dass ihre Statistiken auf dem neuesten Stand sind.

Dies kostet jedoch zu viel Zeit.

Wenn ich spezifiziere

WITH SAMPLE 50 PERCENT

führt SQL Server dann ein Beispiel aus:

  1. die ersten 50% der Seiten
  2. jede andere Seite
  3. oder eine andere Strategie?

BOL ist diesbezüglich nicht klar.

Nik
quelle

Antworten:

16

Denn WITH SAMPLE 50 PERCENTes funktioniert so, als würde SQL Server für jede Datenseite in der Tabelle eine Münze werfen. Wenn es Köpfe landet, liest es alle Zeilen auf der Seite. Wenn es Schwänze landet, liest es keine.

Wenn Sie den UPDATE STATISTICS T WITH SAMPLE 50 PERCENTAnruf im Profiler verfolgen, wird die folgende Abfrage ausgegeben

SELECT StatMan([SC0], [SB0000])
FROM   (SELECT TOP 100 PERCENT [SC0],
                               step_direction([SC0]) OVER (ORDER BY NULL) AS [SB0000]
        FROM   (SELECT [C] AS [SC0]
                FROM   [dbo].[T] TABLESAMPLE SYSTEM (5.000000e+001 PERCENT) 
                WITH (READUNCOMMITTED)) AS _MS_UPDSTATS_TBL_HELPER
        ORDER  BY [SC0],
                  [SB0000]) AS _MS_UPDSTATS_TBL
OPTION (MAXDOP 1) 

Mit Plan

Geben Sie hier die Bildbeschreibung ein

TABLESAMPLE SYSTEM (5.000000e+001 PERCENT)ist für die Probenahme verantwortlich und wird hier dokumentiert

TABLESAMPLE SYSTEMGibt einen ungefähren Prozentsatz der Zeilen zurück und generiert einen zufälligen Wert für jede physische 8-KB-Seite in der Tabelle. Basierend auf dem Zufallswert für eine Seite und dem in der Abfrage angegebenen Prozentsatz wird eine Seite entweder in die Stichprobe aufgenommen oder ausgeschlossen. Jede enthaltene Seite gibt alle Zeilen in der Beispielergebnismenge zurück.

In der Dokumentation heißt es auch

Obwohl der Plan zeigt, dass ein Tabellenscan durchgeführt wird, müssen nur die Seiten, die in der Ergebnismenge enthalten sind, tatsächlich aus der Datendatei gelesen werden.

Der STATMANAufruf erfolgt an eine interne Aggregatfunktion, die hier kurz beschrieben wird

Martin Smith
quelle