UPDATE STATISTICS (Transact-SQL)

 

DIESES THEMA GILT FÜR:jaSQL Server (ab 2008)jaAzure SQL-DatenbankjaAzure SQL Data Warehouse jaParallel Data Warehouse

Aktualisiert eine Abfrageoptimierungsstatistik für eine Tabelle oder indizierte Sicht. Standardmäßig aktualisiert der Abfrageoptimierer Statistiken bereits als nötig, um den Abfrageplan zu verbessern; In einigen Fällen können Sie die abfrageleistung verbessern, indem Sie UPDATE STATISTICS oder der gespeicherten Prozedur Sp_updatestats so aktualisieren Sie Statistiken häufiger als die Standardeinstellung.

Durch das Update von Statistiken wird sichergestellt, dass Abfragen anhand aktueller Statistiken kompiliert werden. Dies führt jedoch dazu, dass Abfragen 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-Vorgänge können mithilfe von tempdb die Stichprobenzeilen zum Erstellen von Statistiken sortieren.

Topic link icon Transact-SQL-Syntaxkonventionen

-- 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   
            | SAMPLE number { PERCENT | ROWS }   
            | RESAMPLE   
              [ ON PARTITIONS ( { <partition_number> | <range> } [, …n] ) ]  
            | <update_stats_stream_option> [ ,...n ]  
        ]   
        [ [ , ] [ ALL | COLUMNS | INDEX ]   
        [ [ , ] NORECOMPUTE ]   
        [ [ , ] INCREMENTAL = { ON | OFF } ]  
    ] ;  
  
<update_stats_stream_option> ::=  
    [ STATS_STREAM = stats_stream ]  
    [ ROWCOUNT = numeric_constant ]  
    [ PAGECOUNT = numeric_contant ]  

-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse  
  
UPDATE STATISTICS schema_name . ] table_name   
    [ ( { statistics_name | index_name } ) ]  
    [ WITH   
       {  
              FULLSCAN   
            | SAMPLE number PERCENT   
            | RESAMPLE   
        }  
    ]  
[;]  

table_or_indexed_view_name
Ist der Name der Tabelle oder indizierten Sicht, der die Statistik-Objekt enthält.

index_or_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 nicht angegeben ist, wird der Abfrageoptimierer aktualisiert 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 zu AUTO_CREATE_STATISTICS finden Sie unter ALTER DATABASE SET-Optionen (Transact-SQL). Um alle Indizes für eine Tabelle oder Sicht anzuzeigen, können Sie Sp_helpindex.

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 SAMPLE-Option verwendet werden.

Beispiel Anzahl {Prozent | ZEILEN}
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 Anzahl kann einen Wert von 0 bis 100 und für Zeilen, Anzahl Werte von 0 bis die Gesamtzahl der Zeilen. 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.

Beispiel eignet sich für Spezialfä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.

Beginnend mit SQL Server 2016, Stichprobenentnahme von Daten zum Erstellen von Statistiken parallel erfolgt beim Kompatibilitätsgrad 130 zur Verfügung, zum Verbessern der Leistung der Sammlung von Statistikdaten zu verwenden. Wenn die Tabellengröße einer einen bestimmten Schwellenwert überschreitet, verwendet der Abfrageoptimierer Statistiken parallel-Beispiels.

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.

Eine vollständige Überprüfung ist nicht erforderlich, und Standardstichprobe ist ausreichend, für die meisten Arbeitslasten.
Bestimmte arbeitsauslastungen, die empfindlich gegenüber verschiedenen datenverteilungen sind erfordern jedoch eine höhere Stichprobengröße oder sogar eine vollständige Überprüfung.
Weitere Informationen finden Sie unter der Blog von CSS SQL Eskalation Services.

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.

PARTITIONEN ({ <partition_number>| <>> } [, …n] ) ]</partition_number>
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.

Gilt für: SQL Server 2014 bis SQL Server 2016.

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.

Das Verhalten der AUTO_UPDATE_STATISTICS-Option wieder zu aktivieren, führen Sie UPDATE STATISTICS erneut ohne die NORECOMPUTE-Option oder ausführen Sp_autostats.

System_CAPS_ICON_warning.jpg 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 zur AUTO_STATISTICS_UPDATE-Option finden Sie unter ALTER DATABASE SET-Optionen (Transact-SQL).

INCREMENTAL = { ON | OFF }
Wenn ON, die Statistiken als Statistiken pro Partition neu erstellt werden. Wenn OFF, wird die statistikstruktur gelöscht und SQL Server die Statistiken neu berechnet. Die Standardeinstellung 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.

Gilt für: SQL Server 2014 bis SQL Server 2016.

<update_stats_stream_option></update_stats_stream_option>
Nur für Informationszwecke identifiziert. Wird nicht unterstützt. Künftige Kompatibilität wird nicht garantiert.

Weitere Informationen zur Verwendung von UPDATE STATISTICS, finden Sie unter Statistiken.

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 (Transact-SQL). Durch den folgenden Befehl wird beispielsweise sp_updatestats zum Aktualisieren aller Statistiken für die Datenbank aufgerufen.

EXEC sp_updatestats;  

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

Die folgende Syntax wird von PDW nicht unterstützt / SQL Data Warehouse

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

Erfordert die ALTER-Berechtigung in der Tabelle oder Sicht.

A. Update aller Statistiken für eine Tabelle

Das folgende Beispiel aktualisiert die Statistiken für alle Indizes auf die SalesOrderDetail Tabelle.

USE AdventureWorks2012;  
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 AdventureWorks2012;  
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 AdventureWorks2012;  
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 AdventureWorks2012;  
GO  
UPDATE STATISTICS Production.Product(Products)  
    WITH FULLSCAN, NORECOMPUTE;  
GO  

E. Aktualisieren von Statistiken für eine Tabelle

Das folgende Beispiel aktualisiert die CustomerStats1 Statistiken für die Customer Tabelle.

UPDATE STATISTICS Customer ( CustomerStats1 );  

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

Das folgende Beispiel aktualisiert die CustomerStats1 Statistiken, basierend auf das Scannen aller Zeilen in der Customer Tabelle.

UPDATE STATISTICS Customer (CustomerStats1) WITH FULLSCAN;  

G. Update aller Statistiken für eine Tabelle

Das folgende Beispiel aktualisiert alle Statistiken für die Customer Tabelle.

UPDATE STATISTICS Customer;  

Statistiken
ALTER DATABASE (Transact-SQL)
CREATE STATISTICS (Transact-SQL)
DBCC SHOW_STATISTICS (Transact-SQL)
DROP STATISTICS (Transact-SQL)
Sp_autostats (Transact-SQL)
Sp_updatestats (Transact-SQL)
STATS_DATE (Transact-SQL)

Community-Beiträge

HINZUFÜGEN
Anzeigen: