Teilen über


UPDATE STATISTICS (Transact-SQL)

Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) SQL Analytics-Endpunkt in Microsoft Fabric Warehouse in Microsoft Fabric

Aktualisiert Statistiken zur Abfrageoptimierung für eine Tabelle oder indizierte Sicht. Standardmäßig nimmt der Abfrageoptimierer erforderliche Updates der Statistiken automatisch vor, um den Abfrageplan zu verbessern. In einigen Fällen können Sie die Abfrageleistung mit UPDATE STATISTICS oder der gespeicherten Prozedur sp_updatestats verbessern, um Statistiken häufiger zu aktualisieren als von der Standardeinstellung vorgegeben.

Durch das Update von Statistiken wird sichergestellt, dass Abfragen anhand aktueller Statistiken kompiliert werden. Das Aktualisieren von Statistiken über einen beliebigen Prozess kann dazu führen, dass Abfragepläne automatisch neu kompiliert werden. Es empfiehlt sich, Statistiken nicht zu oft zu aktualisieren und die Vorteile optimierter Abfragepläne gegen den Zeitaufwand für die Neukompilierung von Abfragen abzuwägen. Die Entscheidung hängt von der verwendeten Anwendung ab. UPDATE STATISTICS kann tempdb verwenden, um die Stichprobenzeilen zum Erstellen von Statistiken zu sortieren.

Hinweis

Weitere Informationen zu Statistiken in Microsoft Fabric finden Sie unter Statistiken in Microsoft Fabric.

Transact-SQL-Syntaxkonventionen

Syntax

-- Syntax for SQL Server and Azure SQL Database  
  
UPDATE STATISTICS table_or_indexed_view_name   
    [   
        {   
            { index_or_statistics__name }  
          | ( { index_or_statistics_name } [ ,...n ] )   
                }  
    ]   
    [    WITH   
        [  
            FULLSCAN   
              [ [ , ] PERSIST_SAMPLE_PERCENT = { ON | OFF } ]    
            | SAMPLE number { PERCENT | ROWS }   
              [ [ , ] PERSIST_SAMPLE_PERCENT = { ON | OFF } ]    
            | RESAMPLE   
              [ ON PARTITIONS ( { <partition_number> | <range> } [, ...n] ) ]  
            | <update_stats_stream_option> [ ,...n ]  
        ]   
        [ [ , ] [ ALL | COLUMNS | INDEX ]   
        [ [ , ] NORECOMPUTE ]   
        [ [ , ] INCREMENTAL = { ON | OFF } ] 
        [ [ , ] MAXDOP = max_degree_of_parallelism ]
        [ [ , ] AUTO_DROP = { ON | OFF } ]
    ] ;  
  
<update_stats_stream_option> ::=  
    [ STATS_STREAM = stats_stream ]  
    [ ROWCOUNT = numeric_constant ]  
    [ PAGECOUNT = numeric_contant ]  
-- Syntax for Azure Synapse Analytics and Parallel Data Warehouse 
  
UPDATE STATISTICS [ schema_name . ] table_name   
    [ ( { statistics_name | index_name } ) ]  
    [ WITH   
       {  
              FULLSCAN   
            | SAMPLE number PERCENT   
            | RESAMPLE   
        }  
    ]  
[;]  
-- Syntax for Microsoft Fabric

UPDATE STATISTICS [ schema_name . ] table_name   
    [ ( { statistics_name } ) ]  
    [ WITH   
       {  
              FULLSCAN   
            | SAMPLE number PERCENT   
        }  
    ]  
[;]  

Hinweis

Diese Syntax wird vom serverlosen SQL-Pool in Azure Synapse Analytics nicht unterstützt.

Argumente

table_or_indexed_view_name

Der Name der Tabelle oder der indizierten Sicht, die das Statistikobjekt enthält.

index_or_statistics_name oder statistics_name | index_name oder statistics_name

Der Name des Index, für den die Statistik aktualisiert werden soll, oder der Name der zu aktualisierenden Statistik. Wenn index_or_statistics_name oder statistics_name nicht angegeben ist, aktualisiert der Abfrageoptimierer alle Statistiken für die Tabelle oder indizierte Sicht. Dies schließt Statistiken ein, die mithilfe der CREATE STATISTICS-Anweisung erstellt wurden, Statistiken für einzelne Spalten, die mit aktivierter AUTO_CREATE_STATISTICS-Option erstellt wurden, sowie für Indizes erstellte Statistiken.

Weitere Informationen über AUTO_CREATE_STATISTICS finden Sie unter ALTER DATABASE SET-Optionen. Zum Anzeigen aller Indizes einer Tabelle oder Sicht können Sie sp_helpindex verwenden.

FULLSCAN

Berechnen Sie die Statistik, indem Sie alle Zeilen in der Tabelle oder indizierten Sicht scannen. FULLSCAN und SAMPLE 100 PERCENT führen zu gleichen Ergebnissen. FULLSCAN kann nicht in Verbindung mit der Option SAMPLE verwendet werden.

SAMPLE Zahl { PERCENT | ROWS }

Gibt den ungefähren Prozentsatz oder die ungefähre Anzahl von Zeilen in der Tabelle oder indizierten Sicht an, die vom Abfrageoptimierer beim Aktualisieren von Statistiken verwendet werden soll. Für PERCENT kann Zahlenwerte von 0 bis 100 annehmen, für ROWS kann Zahlenwerte von 0 bis zur Gesamtanzahl der Zeilen annehmen. Der tatsächliche Prozentsatz oder die tatsächliche Anzahl von Zeilen, die vom Abfrageoptimierer als Stichprobe entnommen werden, stimmt möglicherweise nicht mit dem angegebenen Prozentsatz oder der angegebenen Anzahl überein. Der Abfrageoptimierer scannt z. B. alle Zeilen auf einer Datenseite.

SAMPLE eignet sich für Sonderfälle, in denen der auf Standardstichproben beruhende Abfrageplan nicht optimal ist. In den meisten Situationen muss SAMPLE nicht angegeben werden, da der Abfrageoptimierer standardmäßig Stichproben verwendet und die statistisch signifikante Stichprobengröße ermittelt, wie zum Erstellen hochwertiger Abfragepläne erforderlich.

Hinweis

In SQL Server 2016 (13.x) bei Verwendung der Datenbankkompatibilitätsebene 130 erfolgt das Sampling von Daten zum Erstellen von Statistiken parallel zur Verbesserung der Leistung der Statistiksammlung. Der Abfrageoptimierer verwendet parallele Beispielstatistiken, wenn eine Tabellengröße einen bestimmten Schwellenwert überschreitet. Ab SQL Server 2017 (14.x) wurde das Verhalten unabhängig von der Datenbankkompatibilitätsstufe wieder auf die Verwendung einer seriellen Überprüfung geändert, um potenzielle Leistungsprobleme mit übermäßigen LATCH-Wartezeiten zu vermeiden. Der rest des Abfrageplans während der Aktualisierung von Statistiken behält bei qualifizierter Qualifikation die parallele Ausführung bei.

SAMPLE kann nicht in Verbindung mit der Option FULLSCAN verwendet werden. Wenn weder SAMPLE noch FULLSCAN angegeben wurde, verwendet der Abfrageoptimierer Stichprobendaten und berechnet die Stichprobengröße anhand der Standardeinstellungen.

Es wird davon abgeraten, 0 PERCENT oder 0 ROWS anzugeben. Wenn 0 PERCENT oder ROWS angegeben ist, wird das Statistikobjekt aktualisiert, es enthält jedoch keine Statistikdaten.

Bei den meisten Arbeitsauslastungen ist keine vollständige Überprüfung erforderlich, und Standardstichproben sind ausreichend. Allerdings sind bestimmte Arbeitsauslastungen gegenüber stark variierenden Datenverteilungen empfindlich und können deshalb eine erhöhte Anzahl an Stichproben oder sogar eine vollständige Überprüfung erfordern. Während die Schätzungen mit einem vollständigen Scan genauer werden als mit einem Stichproben-Scan, sind komplexe Pläne möglicherweise nicht wesentlich besser.

Weitere Informationen finden Sie unter Komponenten und Konzepte von Statistiken.

RESAMPLE

Aktualisieren Sie alle Statistiken mithilfe ihrer letzten Samplingraten.

Die Verwendung von RESAMPLE kann zu einem vollständigen Tabellenscan führen. Zum Beispiel verwenden die Statistiken für Indizes einen vollständigen Tabellenscan für ihre Beispielrate. Wenn keine der Stichprobenoptionen (SAMPLE, FULLSCAN, RESAMPLE) angegeben wurde, verwendet der Abfrageoptimierer Stichprobendaten und berechnet standardmäßig die Stichprobengröße.

In Warehouse in Microsoft Fabric wird RESAMPLE nicht unterstützt.

PERSIST_SAMPLE_PERCENT = { ON | OFF }

Gilt für: SQL Server 2016 (13.x) Service Pack 1 CU4, SQL Server 2017 (14.x) Service Pack 1, oder SQL Server 2019 (15.x) und spätere Versionen, Azure SQL-Datenbank, Azure SQL Managed Instance

Bei ON behalten die Statistiken den festgelegten Prozentsatz für die Stichprobenentnahme für nachfolgende Updates bei, für die kein expliziter Prozentsatz für die Stichprobenentnahme angegeben ist. Bei OFF wird der Prozentsatz für die Stichprobenentnahme in nachfolgenden Updates auf den Standardwert zurückgesetzt, sofern diese keinen expliziten Prozentsatz für die Stichprobenentnahme angeben. Der Standardwert ist OFF.

DBCC SHOW_STATISTICS und sys.dm_db_stats_properties machen den beibehaltenen Prozentwert für die Stichprobenentnahme der ausgewählten Statistik verfügbar.

Wenn AUTO_UPDATE_STATISTICS ausgeführt wird, wird der beibehaltene Prozentsatz für die Stichprobenentnahme verwendet, wenn er verfügbar ist. Wenn er nicht verfügbar ist, wird der Standardprozentsatz verwendet. Das Verhalten von RESAMPLE wird von dieser Option nicht beeinflusst.

Wenn die Tabelle gekürzt wird, werden alle Statistiken, die auf dem gekürzten Heap oder B-tree (HoBT) erstellt wurden, wieder den Standard-Prozentsatz für die Stichprobenentnahme verwenden.

Hinweis

In SQL Server wird beim Neuerstellen eines Indexes, für den zuvor Statistiken mit PERSIST_SAMPLE_PERCENT aktualisiert wurden, der persistierte Stichprobenprozentwert auf den Standardwert zurückgesetzt. Ab SQL Server 2016 (13.x) SP2 CU17, SQL Server 2017 (14.x) CU26 und SQL Server 2019 (15.x) CU10 wird der persistierte Stichprobenprozentwert auch beim Neuerstellen eines Indexes beibehalten.

ON PARTITIONS ( { <partition_number> | <range> } [, ...n] ) ]

Gilt für: SQL Server 2014 (12.x) und höher

Erzwingt, dass die Statistiken auf Blattebene, die die in der ON PARTITIONS-Klausel angegebenen Partitionen umfassen, erneut berechnet und dann zusammengeführt werden, um die globale Statistik zu bilden. WITH RESAMPLE ist erforderlich, da mit unterschiedlichen Stichprobenraten erstellte Partitionsstatistiken nicht zusammengeführt werden können.

ALL | COLUMNS | INDEX

Aktualisieren Sie alle vorhandenen Statistiken, für eine oder mehrere Spalten erstellte Statistiken oder für Indizes erstellte Statistiken. Wenn keine der Optionen angegeben wird, aktualisiert die UPDATE STATISTICS-Anweisung alle Statistiken für die Tabelle oder indizierte Sicht.

NORECOMPUTE

Deaktiviert die AUTO_UPDATE_STATISTICS-Option zum automatischen Statistikupdate für die angegebene Statistik. Wenn diese Option angegeben wird, schließt der Abfrageoptimierer dieses Statistikupdate ab und deaktiviert zukünftige Updates.

Um das Verhalten der AUTO_UPDATE_STATISTICS-Option wieder zu aktivieren, führen Sie UPDATE STATISTICS erneut ohne die NORECOMPUTE-Option aus, oder führen Sie sp_autostats aus.

Warnung

Bei Verwendung dieser Option können suboptimale Abfragepläne entstehen. Es wird empfohlen, diese Option nur in Einzelfällen von einem qualifizierten Systemadministrator vornehmen zu lassen.

Weitere Informationen über die Option AUTO_STATISTICS_UPDATE finden Sie unter ALTER DATABASE SET-Optionen.

INCREMENTAL = { ON | OFF }

Gilt für: SQL Server 2014 (12.x) und höher

Bei ON werden die Statistiken als Statistiken pro Partition neu erstellt. Bei OFF wird die Statistikstruktur gelöscht und SQL Server berechnet die Statistiken erneut. Der Standardwert ist OFF.

Wenn Statistiken pro Partition nicht unterstützt werden, wird ein Fehler generiert. Inkrementelle Statistiken werden für folgende Statistiktypen nicht unterstützt:

  • Statistiken, die mit Indizes erstellt wurden, die über keine Partitionsausrichtung mit der Basistabelle verfügen.
  • Statistiken, die für lesbare sekundäre Always On-Datenbanken erstellt wurden.
  • Statistiken, die für schreibgeschützte Datenbanken erstellt wurden.
  • Statistiken, die für gefilterte Indizes erstellt wurden.
  • Statistiken, die für Sichten erstellt wurden.
  • Statistiken, die für interne Tabellen erstellt wurden.
  • Statistiken, die mit räumlichen Indizes oder XML-Indizes erstellt wurden.

MAXDOP = max_degree_of_parallelism

Gilt für: SQL Server (Ab SQL Server 2016 (13.x) SP2 und SQL Server 2017 (14.x) CU3).

Überschreibt die Konfigurationsoption max degree of parallelism (Max. Grad an Parallelität) für die Dauer des Statistikvorgangs. Weitere Informationen finden Sie unter Konfigurieren der Serverkonfigurationsoption Max. Grad an Parallelität. Sie können mit MAXDOP die Anzahl der Prozessoren begrenzen, die bei der Ausführung paralleler Pläne verwendet werden. Maximal sind 64 Prozessoren zulässig.

max_degree_of_parallelism kann folgende Werte haben:

1
Unterdrückt das Generieren paralleler Pläne.

>1 Beschränkt die maximale Anzahl der Prozessoren, die bei einem parallelen Statistikvorgang verwendet werden, je nach aktueller Systemauslastung, auf die angegebene Zahl oder einen niedrigeren Wert.

0 (Standard)
Verwendet abhängig von der aktuellen Systemarbeitsauslastung die tatsächliche Anzahl von Prozessoren oder weniger Prozessoren.

update_stats_stream_option

Nur für Informationszwecke identifiziert. Wird nicht unterstützt. Zukünftige Kompatibilität wird nicht sichergestellt.

AUTO_DROP = { ON | OFF }

Gilt für: SQL Server 2022 (16.x) und höher.

Wenn derzeit Statistiken von einem Drittanbietertool für eine Kundendatenbank erstellt werden, können diese Statistikobjekte Schemaänderungen, die der Kunde wünscht, blockieren oder stören.

(Ab SQL Server 2022 (16.x))| Dieses Feature ermöglicht das Erstellen von Statistikobjekten derart, dass eine Schemaänderung nicht durch die Statistiken blockiert wird, sondern stattdessen die Statistiken gelöscht werden. Auf diese Weise verhalten sich automatisch gelöschte Statistiken wie automatisch erstellte Statistiken.

Hinweis

Der Versuch, die Auto_Drop-Eigenschaft für automatisch erstellte Statistiken festzulegen oder zu deaktivieren, könnte Fehler auslösen – automatisch erstellte Statistiken verwenden immer Auto_Drop. Bei einigen Sicherungen kann diese Eigenschaft nach der Wiederherstellung falsch eingestellt sein, bis das Statistikobjekt das nächste Mal (manuell oder automatisch) aktualisiert wird. Automatisch erstellte Statistiken verhalten sich jedoch immer wie automatisch gelöschte Statistiken.

Hinweise

Zeitpunkt der AKTUALISIERUNG VON STATISTIKEN

Weitere Informationen zur Verwendung von UPDATE STATISTICS finden Sie unter Zeitpunkt der Aktualisierung von Statistiken.

Begrenzungen

  • Das Aktualisieren von Statistiken bei externen Tabellen wird nicht unterstützt. Zum Aktualisieren einer Statistik müssen Sie die Statistik löschen und neu erstellen.
  • Die Option MAXDOP ist mit den Optionen STATS_STREAM, ROWCOUNT und PAGECOUNT nicht kompatibel.
  • Die Option MAXDOP ist, falls verwendet, durch die Einstellung „MAX_DOP“ der Resource Governor-Arbeitsauslastungsgruppe eingeschränkt.

Aktualisieren aller Statistiken mit „sp_updatestats“

Informationen zum Aktualisieren von Statistiken für alle benutzerdefinierten und internen Tabellen in der Datenbank finden Sie in der Beschreibung der gespeicherten Prozedur sp_updatestats. Durch den folgenden Befehl wird beispielsweise sp_updatestats zum Aktualisieren aller Statistiken für die Datenbank aufgerufen.

EXEC sp_updatestats;  

Automatische Verwaltung von Index und Statistiken

Nutzen Sie Lösungen wie Adaptive Index Defrag, um die Indexdefragmentierung und das Aktualisieren der Statistiken für eine oder mehrere Datenbanken automatisch zu verwalten. Dieser Vorgang entscheidet unter anderem anhand des Fragmentierungsgrads automatisch, ob ein Index neu organisiert oder neu erstellt wird und aktualisiert Statistiken mit einem linearen Schwellenwert.

Ermitteln des letzten Statistikupdates

Um zu ermitteln, wann Statistiken zuletzt aktualisiert wurden, verwenden Sie die STATS_DATE -Funktion.

PDW/Azure Synapse Analytics

Die folgende Syntax wird von Analytics Platform System (PDW) / Azure Synapse Analytics nicht unterstützt.

UPDATE STATISTICS t1 (a,b);   
UPDATE STATISTICS t1 (a) WITH SAMPLE 10 ROWS;  
UPDATE STATISTICS t1 (a) WITH NORECOMPUTE;  
UPDATE STATISTICS t1 (a) WITH INCREMENTAL = ON;  
UPDATE STATISTICS t1 (a) WITH stats_stream = 0x01;  

Berechtigungen

Erfordert die ALTER-Berechtigung für die Tabelle oder Sicht.

Beispiele

A. Update aller Statistiken für eine Tabelle

Im folgenden Beispiel werden alle Statistiken in der Tabelle SalesOrderDetail aktualisiert.

USE AdventureWorks2022;  
GO  
UPDATE STATISTICS Sales.SalesOrderDetail;  
GO  

B. Aktualisieren der Statistiken für einen Index

Im folgenden Beispiel wird die Statistik für den AK_SalesOrderDetail_rowguid-Index der SalesOrderDetail-Tabelle aktualisiert.

USE AdventureWorks2022;  
GO  
UPDATE STATISTICS Sales.SalesOrderDetail AK_SalesOrderDetail_rowguid;  
GO  

C. Aktualisieren von Statistiken mit einer Stichprobengröße von 50 %

Im folgenden Beispiel wird die Statistik für die Name-Spalte und die ProductNumber-Spalte in der Product-Tabelle erstellt.

USE AdventureWorks2022;
GO  
CREATE STATISTICS Products
    ON Production.Product ([Name], ProductNumber)
    WITH SAMPLE 50 PERCENT
-- Time passes. The UPDATE STATISTICS statement is then executed.
UPDATE STATISTICS Production.Product(Products)
    WITH SAMPLE 50 PERCENT;

D: Aktualisieren von Statistiken mit FULLSCAN und NORECOMPUTE

Im folgenden Beispiel wird die Products-Statistik in der Product-Tabelle aktualisiert, ein vollständiger Scan aller Zeilen in der Product-Tabelle erzwungen und alle automatischen Statistiken für die Products-Statistik deaktiviert.

USE AdventureWorks2022;  
GO  
UPDATE STATISTICS Production.Product(Products)  
    WITH FULLSCAN, NORECOMPUTE;  
GO  

Beispiele: Azure Synapse Analytics und Analytics-Plattformsystem (PDW)

E. Aktualisieren aller Statistiken für eine Tabelle

Im folgenden Beispiel wird die Statistik CustomerStats1 in der Tabelle Customer aktualisiert.

UPDATE STATISTICS Customer (CustomerStats1);  

F. Aktualisieren von Statistiken mithilfe einer vollständigen Überprüfung

Im folgenden Beispiel wird die Statistik CustomerStats1 basierend auf allen Zeilen in der Tabelle Customer aktualisiert.

UPDATE STATISTICS Customer (CustomerStats1) WITH FULLSCAN;  

G. Update aller Statistiken für eine Tabelle

Im folgenden Beispiel werden alle Statistiken in der Tabelle Customer aktualisiert.

UPDATE STATISTICS Customer;

H. Verwenden von CREATE STATISTICS mit AUTO_DROP

Um Auto-Drop-Statistiken zu verwenden, fügen Sie der WITH-Klausel bei der Statistikerstellung oder -aktualisierung einfach Folgendes hinzu.

UPDATE STATISTICS Customer (CustomerStats1) WITH AUTO_DROP = ON