UPDATE STATISTICS (Transact-SQL)
Gilt für:SQL Server
Azure SQL-Datenbank
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
SQL-Analyseendpunkt in Microsoft Fabric
Warehouse in Microsoft Fabric
SQL-Datenbank 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 Statistics in Fabric Data Warehouse.
Transact-SQL-Syntaxkonventionen
Syntax
Syntax für SQL Server und Azure SQL-Datenbank.
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_constant ]
Syntax für Azure Synapse Analytics und Parallel Data Warehouse.
UPDATE STATISTICS [ schema_name . ] table_name
[ ( { statistics_name | index_name } ) ]
[ WITH
{
FULLSCAN
| SAMPLE number PERCENT
| RESAMPLE
}
]
[;]
Syntax für 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 Tabellen- oder indizierten Ansicht, die das Statistikobjekt enthält.
index_or_statistics_name oder statistics_name | index_name oder statistics_name
Der Name des Indexes zum Aktualisieren von Statistiken zu oder Namen der zu aktualisierenden Statistiken. Wenn index_or_statistics_name oder statistics_name nicht angegeben ist, aktualisiert der Abfrageoptimierer alle Statistiken für die Tabelle oder indizierte Sicht. Dazu gehören Statistiken, die mit der CREATE STATISTICS
Anweisung erstellt wurden, statistiken mit einer Spalte, die bei AUTO_CREATE_STATISTICS
der Erstellung erstellt wurde, und Statistiken, die für Indizes erstellt wurden.
Weitere Informationen 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
haben dieselben Ergebnisse.
FULLSCAN
kann nicht mit der SAMPLE
Option 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. Bei PERCENT
" kann "Zahl " zwischen 0 und 100 und für ROWS
"Zahl" zwischen 0 und " Zahl " zwischen 0 und der Gesamtanzahl der Zeilen stehen. 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
ist für Sonderfälle nützlich, in denen der Abfrageplan basierend auf dem Standardsampling nicht optimal ist. In den meisten Fällen ist es nicht erforderlich, anzugeben SAMPLE
, da der Abfrageoptimierer Sampling verwendet und standardmäßig die statistisch signifikante Stichprobengröße bestimmt, wie erforderlich, um qualitativ hochwertige Abfragepläne zu erstellen.
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 mit der FULLSCAN
Option verwendet werden. Wenn weder SAMPLE
angegeben noch FULLSCAN
angegeben wird, verwendet der Abfrageoptimierer stichprobenierte Daten und berechnet standardmäßig die Beispielgröße.
Es wird empfohlen, die Angabe 0 PERCENT
oder 0 ROWS
. Wenn 0 PERCENT
oder 0 ROWS
angegeben wird, wird das Statistikobjekt aktualisiert, enthält jedoch keine Statistikdaten.
Bei den meisten Arbeitsauslastungen ist keine vollständige Überprüfung erforderlich, und Standardstichproben sind ausreichend. Bestimmte Workloads, die für stark unterschiedliche Datenverteilungen sensibel sind, erfordern jedoch möglicherweise eine erhöhte Stichprobengröße oder sogar eine vollständige Überprüfung. Während Schätzungen mit einem vollständigen Scan möglicherweise genauer werden als bei einem stichprobenierten Scan, profitieren komplexe Pläne möglicherweise nicht erheblich.
Weitere Informationen finden Sie unter Komponenten und Konzepte von Statistiken.
RESAMPLE
Aktualisieren Sie alle Statistiken mithilfe ihrer letzten Samplingraten.
Die Verwendung RESAMPLE
kann zu einem Vollständigtabellenscan führen. Zum Beispiel verwenden die Statistiken für Indizes einen vollständigen Tabellenscan für ihre Beispielrate. Wenn keine der Beispieloptionen (SAMPLE
, FULLSCAN
, RESAMPLE
) angegeben ist, wird vom Abfrageoptimierer die Daten beispielt und die Beispielgröße standardmäßig berechnet.
In Warehouse in Microsoft Fabric RESAMPLE
wird 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
In diesem Zeitraum ON
behält die Statistik den festgelegten Sampling-Prozentsatz für nachfolgende Aktualisierungen bei, die keinen Stichprobenprozentsatz explizit angeben. Wenn OFF
der Prozentsatz der Statistischen Samplings in nachfolgenden Updates auf die Standardsampling zurückgesetzt wird, die keinen Stichprobenprozentsatz explizit 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
dieser Wert ausgeführt wird, wird der permanente Samplingprozentsatz verwendet, falls verfügbar, oder wenn nicht, wird der Standardsamplingprozentsatz verwendet.
RESAMPLE
Das Verhalten ist von dieser Option nicht betroffen.
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. Wenn Statistiken für ein Objekt ohne Zeilen aktualisiert werden, wird er auch dann wieder auf die Verwendung des Standardsamplingprozentsatzes zurückgesetzt, wenn PERSIST_SAMPLE_PERCENT
sie zuvor konfiguriert wurde.
Hinweis
Wenn Sie in SQL Server einen Index neu erstellen, mit PERSIST_SAMPLE_PERCENT
dem zuvor Statistiken aktualisiert wurden, wird der beibehaltene Beispielprozentwert 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öhere Versionen
Erzwingt die Statistiken auf Blattebene, die die in der ON PARTITIONS
Klausel angegebenen Partitionen neu komputieren und dann zusammengeführt werden, um die globalen Statistiken zu erstellen.
WITH RESAMPLE
ist erforderlich, da Partitionsstatistiken, die mit unterschiedlichen Stichprobenraten erstellt wurden, 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 ist, aktualisiert die UPDATE STATISTICS
Anweisung alle Statistiken in der Tabellen- oder indizierten Ansicht.
NORECOMPUTE
Deaktivieren Sie die Option AUTO_UPDATE_STATISTICS
"Automatische Statistikaktualisierung" für die angegebenen Statistiken. Wenn diese Option angegeben wird, schließt der Abfrageoptimierer dieses Statistikupdate ab und deaktiviert zukünftige Updates.
Wenn Sie das AUTO_UPDATE_STATISTICS
Optionsverhalten erneut aktivieren möchten, führen Sie UPDATE STATISTICS
es erneut aus, ohne die NORECOMPUTE
Option oder Ausführung auszuführen sp_autostats
.
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.
INCREMENTAL = { ON | OFF }
Gilt für: SQL Server 2014 (12.x) und höhere Versionen
Wenn ON
die Statistiken gemäß Partitionsstatistiken neu erstellt werden. Wenn OFF
die Statistikstruktur verworfen wird und SQL Server die Statistiken neu berechnet. 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 max degree of parallelism
Konfigurationsoption für die Dauer des Statistikvorgangs. Weitere Informationen finden Sie unter Konfigurieren der Serverkonfigurationsoption Max. Grad an Parallelität. Wird verwendet MAXDOP
, um die Anzahl der Prozessoren zu begrenzen, die in einer parallelen Planausführung 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 von Prozessoren, die in einem parallelen Statistikvorgang verwendet werden, auf die angegebene Zahl oder weniger basierend auf der aktuellen Systemauslastung.
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öhere Versionen
Wenn Statistiken von einem Drittanbietertool für eine Kundendatenbank erstellt werden, können diese Statistikobjekte Schemaänderungen blockieren oder beeinträchtigen, die der Kunde möglicherweise wünscht.
(Ab SQL Server 2022 (16.x)| Dieses Feature ermöglicht die Erstellung von Statistikobjekten in einem Modus, sodass eine Schemaänderung nicht von den Statistiken blockiert werden, sondern stattdessen werden die Statistiken gelöscht. Auf diese Weise verhalten sich automatisch gelöschte Statistiken wie automatisch erstellte Statistiken.
Hinweis
Wenn Sie versuchen, die Auto_Drop Eigenschaft für automatisch erstellte Statistiken festzulegen oder aufzuheben, können Fehler auslösen – automatisch erstellte Statistiken verwenden immer den automatischen Drop. Einige Sicherungen, wenn sie wiederhergestellt werden, haben diese Eigenschaft möglicherweise falsch festgelegt, bis das nächste Mal aktualisiert wird (manuell oder automatisch). 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.
- Das automatische Aktualisieren der statistiken, die für jeden Columnstore-Index erstellt wurden, wird nicht unterstützt. Der Versuch führt zu Fehler 35337:
UPDATE STATISTICS failed because statistics cannot be updated on a columnstore index. UPDATE STATISTICS is valid only when used with the STATS_STREAM option.
- Die Option
MAXDOP
ist mit den OptionenSTATS_STREAM
,ROWCOUNT
undPAGECOUNT
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.
EXECUTE 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. Diese Vorgehensweise entscheidet unter anderem anhand des Fragmentierungsgrads automatisch, ob ein Index neu erstellt oder neu organisiert wird, und aktualisiert Statistiken mit einem linearen Schwellenwert.
Ermitteln der letzten Statistikaktualisierung
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;
Zugehöriger Inhalt
- Statistik
- Statistiken in Microsoft Fabric
- ALTER DATABASE (Transact-SQL)
- sys.dm_db_stats_properties (Transact-SQL)
- sys.dm_db_stats_histogram (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)