CREATE STATISTICS (Transact-SQL)
Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance Azure Synapse Analytics SQL Analytics-Endpunkt in Microsoft Fabric Warehouse in Microsoft Fabric
Erstellt Abfrageoptimierungsstatistiken in einer oder mehreren Spalten einer Tabelle, einer indizierten Sicht oder einer externen Tabelle. Für die meisten Abfragen generiert der Abfrageoptimierer bereits die erforderlichen Statistiken für einen qualitativ hochwertigen Abfrageplan; In einigen Fällen müssen Sie zusätzliche Statistiken erstellen oder CREATE STATISTICS
den Abfrageentwurf ändern, um die Abfrageleistung zu verbessern.
Weitere Informationen finden Sie unter Statistiken.
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, Azure SQL-Datenbank und Azure SQL verwaltete Instanz.
-- Create statistics on an external table
CREATE STATISTICS statistics_name
ON { table_or_indexed_view_name } ( column [ , ...n ] )
[ WITH FULLSCAN ] ;
-- Create statistics on a regular table or indexed view
CREATE STATISTICS statistics_name
ON { table_or_indexed_view_name } ( column [ , ...n ] )
[ WHERE <filter_predicate> ]
[ WITH
[ FULLSCAN
[ [ , ] PERSIST_SAMPLE_PERCENT = { ON | OFF } ]
| SAMPLE number { PERCENT | ROWS }
[ [ , ] PERSIST_SAMPLE_PERCENT = { ON | OFF } ]
| <update_stats_stream_option> [ , ...n ]
[ [ , ] NORECOMPUTE ]
[ [ , ] INCREMENTAL = { ON | OFF } ]
[ [ , ] MAXDOP = max_degree_of_parallelism ]
[ [ , ] AUTO_DROP = { ON | OFF } ]
]
];
<filter_predicate> ::=
<conjunct> [ AND <conjunct> ]
<conjunct> ::=
<disjunct> | <comparison>
<disjunct> ::=
column_name IN (constant , ...)
<comparison> ::=
column_name <comparison_op> constant
<comparison_op> ::=
IS | IS NOT | = | <> | != | > | >= | !> | < | <= | !<
<update_stats_stream_option> ::=
[ STATS_STREAM = stats_stream ]
[ ROWCOUNT = numeric_constant ]
[ PAGECOUNT = numeric_constant ]
Syntax für Azure Synapse Analytics and Analytics Platform System (PDW).
CREATE STATISTICS statistics_name
ON { database_name.schema_name.table_name | schema_name.table_name | table_name }
( column_name [ , ...n ] )
[ WHERE <filter_predicate> ]
[ WITH {
FULLSCAN
| SAMPLE number PERCENT
}
]
[ ; ]
<filter_predicate> ::=
<conjunct> [ AND <conjunct> ]
<conjunct> ::=
<disjunct> | <comparison>
<disjunct> ::=
column_name IN (constant , ...)
<comparison> ::=
column_name <comparison_op> constant
<comparison_op> ::=
IS | IS NOT | = | <> | != | > | >= | !> | < | <= | !<
Syntax für Microsoft Fabric.
CREATE STATISTICS statistics_name
ON { database_name.schema_name.table_name | schema_name.table_name | table_name }
( column_name )
[ WITH {
FULLSCAN
| SAMPLE number PERCENT
}
]
[ ; ]
Argumente
statistics_name
Der Name der zu erstellenden Statistiken.
table_or_indexed_view_name
Der Name der Tabelle, der indizierten Ansicht oder der externen Tabelle, auf der die Statistiken erstellt werden sollen. Legen Sie einen qualifizierten Tabellennamen fest, um Statistiken für eine andere Datenbank zu erstellen.
Spalte [ ,...n]
Mindestens eine Spalte, die in den Statistiken enthalten sein soll. Die Spalten sollten von links nach rechts nach Priorität geordnet sein. Nur die erste Spalte wird zum Erstellen des Histrogramms verwendet. Alle Spalten werden für spaltenübergreifende Statistiken verwendet, die als „Dichten“ bezeichnet werden.
Sie können beliebige Spalten angeben, die von folgenden Ausnahmen abgesehen als Indexschlüsselspalte angegeben werden können:
XML-, Volltext- und FILESTREAM-Spalten können nicht angegeben werden.
Berechnete Spalten können nur angegeben werden, wenn die
ARITHABORT
Einstellungen undQUOTED_IDENTIFIER
Datenbankeinstellungen sindON
.Spalten des CLR-benutzerdefiniertne Typs können angegeben werden, wenn der Typ die binäre Reihenfolge unterstützt. Berechnete Spalten, die als Methodenaufrufe einer Spalte eines benutzerdefinierten Typs definiert sind, können angegeben werden, wenn die Methoden als deterministisch gekennzeichnet sind.
WHERE <filter_predicate>
Gibt einen Ausdruck zum Auswählen einer Teilmenge von Zeilen an, die beim Erstellen des Statistikobjekts eingeschlossen werden sollen. Statistiken, die mit einem Filterprädikat erstellt werden, werden als gefilterte Statistiken bezeichnet. Das Filterprädikat verwendet einfache Vergleichslogik und kann nicht auf eine berechnete Spalte, eine UDT-Spalte, eine Spalte für räumliche Datentypen oder eine HierarchieID-Datentypspalte verweisen. Vergleiche, die Literale verwenden NULL
, sind mit den Vergleichsoperatoren nicht zulässig. Verwenden Sie stattdessen die Operatoren IS NULL
und IS NOT NULL
.
Es folgen einige Beispiele für Filterprädikate für die Production.BillOfMaterials
-Tabelle:
WHERE StartDate > '20000101' AND EndDate <= '20000630'
WHERE ComponentID IN (533, 324, 753)
WHERE StartDate IN ('20000404', '20000905') AND EndDate IS NOT NULL
Weitere Informationen zu Filter-Prädikaten finden Sie unter Erstellen gefilterter Indizes.
FULLSCAN
Gilt für: SQL Server 2016 (13.x) SP 1 CU 4, SQL Server 2017 (14.x) CU 1 und höhere Versionen
Berechnet die Statistiken, indem alle Zeilen überprüft werden. FULLSCAN
und SAMPLE 100 PERCENT
haben dieselben Ergebnisse. FULLSCAN
kann nicht mit der SAMPLE
Option verwendet werden.
Wenn diese Option ausgelassen wird, verwendet SQL Server Stichproben, um die Statistiken zu erstellen. Zudem wird die Größe der Stichprobe ermittelt, die erforderlich ist, um einen hochwertigen Abfrageplan zu erstellen.
In Warehouse in Microsoft Fabric werden nur einzelspaltige und einspaltige FULLSCAN
SAMPLE
Statistiken unterstützt. Wenn keine Option enthalten ist, SAMPLE
werden Statistiken erstellt.
SAMPLE Zahl { PERCENT | ROWS }
Gibt den ungefähren Prozentsatz oder die Anzahl der Zeilen in der Tabellen- oder indizierten Ansicht für den Abfrageoptimierer an, der beim Erstellen 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 bereits Sampling verwendet und standardmäßig die statistisch signifikante Stichprobengröße bestimmt, wie erforderlich, um qualitativ hochwertige Abfragepläne zu erstellen.
SAMPLE
kann nicht mit der FULLSCAN-Option verwendet werden. Wenn SAMPLE
oder FULLSCAN
nicht angegeben wird, verwendet der Abfrageoptimierer stichprobenierte Daten und berechnet standardmäßig die Beispielgröße.
Es wird davon abgeraten, 0 PERCENT
oder 0 ROWS
anzugeben. Wenn 0 PERCENT
oder 0 ROWS
wird angegeben, wird das Statistikobjekt erstellt, enthält jedoch keine Statistikdaten.
In Warehouse in Microsoft Fabric werden nur einzelspaltige und einspaltige FULLSCAN
SAMPLE
Statistiken unterstützt. Wenn keine Option enthalten ist, FULLSCAN
werden Statistiken erstellt.
PERSIST_SAMPLE_PERCENT = { ON | OFF }
Wenn ON
die Statistiken den Prozentsatz der Erstellungssampling für nachfolgende Aktualisierungen beibehalten, die keinen Stichprobenprozentsatz explizit angeben. When OFF
, Statistics Sampling Percentage gets reset to default sampling in subsequent updates that don't explizit specify a sampling percentage. Der Standardwert ist OFF
.
Hinweis
Wenn die Tabelle abgeschnitten wird, übernehmen alle Statistiken, die basierend auf dem abgeschnittenen HoBT erstellt wurden, wieder den Standardstichproben-Prozentsatz.
STATS_STREAM = stats_stream
Nur für Informationszwecke identifiziert. Wird nicht unterstützt. Zukünftige Kompatibilität wird nicht sichergestellt.
NORECOMPUTE
Deaktivieren Sie die Option "Automatische Statistikaktualisierung" AUTO_STATISTICS_UPDATE
für statistics_name. Wenn diese Option angegeben wird, schließt der Abfrageoptimierer alle laufenden Statistikupdates für statistics_name ab und deaktiviert zukünftige Updates.
Um Statistikaktualisierungen erneut zu aktivieren, entfernen Sie die Statistiken mit DROP STATISTICS, und führen Sie dann ohne die NORECOMPUTE
Option ausCREATE STATISTICS
.
Warnung
Wenn Sie die automatische Aktualisierung von Statistiken deaktivieren, wird möglicherweise verhindert, dass der Abfrageoptimierer optimale Ausführungspläne für Abfragen auswählt, die die Tabelle umfassen. Sie sollten diese Option sparsam und nur von einem qualifizierten Datenbankadministrator verwenden.
Weitere Informationen zur AUTO_STATISTICS_UPDATE
Option finden Sie unter ALTER DATABASE SET-Optionen. Weitere Informationen zum Deaktivieren und erneuten Aktivieren von Statistikupdates finden Sie unter Statistiken.
INCREMENTAL = { ON | OFF }
Gilt für: SQL Server 2014 (12.x) und höhere Versionen
Wenn ON
die erstellten Statistiken pro Partitionsstatistik vorliegen. Wenn OFF
, Statistiken werden für alle Partitionen kombiniert. Der Standardwert ist OFF
.
Wenn pro Partitionsstatistik nicht unterstützt wird, 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 2016 (13.x) SP 2, SQL Server 2017 (14.x) CU 3 und höhere Versionen
Überschreibt die maximale Parallelitätskonfigurationsoption während des Statistikvorgangs. Weitere Informationen finden Sie unter Konfigurieren des maximalen Parallelitätsgrads (Serverkonfigurationsoption). 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 die parallele Plangenerierung.>1
: Beschränkt die maximale Anzahl von Prozessoren, die in einem parallelen Indexvorgang verwendet werden, auf die angegebene Zahl.0
(Standard): Verwendet die tatsächliche Anzahl von Prozessoren oder weniger basierend auf der aktuellen Systemauslastung.
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 und Azure SQL-Datenbank, Azure SQL verwaltete Instanz
Bevor SQL Server 2022 (16.x) von einem Benutzer- oder Drittanbietertool für eine Benutzerdatenbank manuell erstellt wird, können diese Statistikobjekte Schemaänderungen blockieren oder beeinträchtigen, die der Kunde möglicherweise wünscht.
Ab SQL Server 2022 (16.x) ist die AUTO_DROP
Option standardmäßig für alle neuen und migrierten Datenbanken aktiviert. Die AUTO_DROP
Eigenschaft ermöglicht die Erstellung von Statistikobjekten in einem Modus, sodass eine nachfolgende Schemaänderung nicht durch das Statistikobjekt blockiert wird, sondern die Statistiken bei Bedarf gelöscht werden. Auf diese Weise verhalten sich manuell erstellte Statistiken mit AUTO_DROP
aktivierter Funktion wie automatisch erstellte Statistiken.
Hinweis
Wenn Sie versuchen, die Auto_Drop Eigenschaft für automatisch erstellte Statistiken festzulegen oder aufzuheben, können Fehler auftreten. Automatisch erstellte Statistiken verwenden immer die Option Auto_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. Beim Wiederherstellen einer Datenbank in SQL Server 2022 (16.x) aus einer früheren Version wird empfohlen, die Datenbank auszuführen sp_updatestats
und die richtigen Metadaten für das Statistikfeature AUTO_DROP
festzulegen.
Weitere Informationen finden Sie unter der Option AUTO_DROP.
Berechtigungen
Erfordert eine der folgenden Berechtigungen:
ALTER TABLE
- Der Benutzer ist der Tabellenbesitzer.
- Mitgliedschaft in der festen Datenbankrolle db_ddladmin.
Hinweise
SQL Server kann tempdb
verwenden, um die als Stichprobe entnommenen Zeilen vor dem Erstellen der Statistiken zu sortieren.
Statistiken für externe Tabellen
Beim Erstellen von Statistiken für externe Tabellen importiert SQL Server die externe Tabelle in eine temporäre SQL Server-Tabelle und erstellt anschließend die Statistiken. Bei Statistiken für Stichproben werden nur die als Stichprobe entnommenen Zeilen importiert. Wenn Sie über eine große externe Tabelle verfügen, ist es schneller, das Standardsampling anstelle der vollständigen Scanoption zu verwenden.
Wenn die externe Tabelle DELIMITEDTEXT
, CSV
, PARQUET
oder DELTA
als Datentypen verwendet, unterstützt externe Tabellen nur Statistiken für eine Spalte pro CREATE STATISTICS
-Befehl.
Statistiken mit einer gefilterten Bedingung
Gefilterte Statistiken können die Abfrageleistung für Abfragen verbessern, bei denen aus klar definierten Teilmengen von Daten ausgewählt wird. Gefilterte Statistiken verwenden ein Filterprädikat in der WHERE-Klausel, um die Teilmenge von Daten auszuwählen, die in den Statistiken enthalten ist.
Verwendung von CREATE STATISTICS
Weitere Informationen zur Verwendung von CREATE STATISTICS
finden Sie unter Statistiken.
Verweisen auf Abhängigkeiten für gefilterte Statistiken
Die sys.sql_expression_dependencies-Katalogsicht kennzeichnet jede Spalte im gefilterten Statistikprädikat als eine verweisende Abhängigkeit. Berücksichtigen Sie die Vorgänge, die Sie in Tabellenspalten ausführen, bevor Sie gefilterte Statistiken erstellen. Sie können die Definition einer Tabellenspalte, die in einem gefilterten Statistik-Prädikat definiert ist, nicht ablegen, umbenennen oder ändern.
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.
- Sie können bis zu 64 Spalten pro Statistikobjekt auflisten.
- Die
MAXDOP
Option ist nicht kompatibel mitSTATS_STREAM
,ROWCOUNT
undPAGECOUNT
Optionen. - Die Option
MAXDOP
ist, falls verwendet, durch die Einstellung „MAX_DOP
“ der Resource Governor-Arbeitsauslastungsgruppe eingeschränkt. CREATE
undDROP STATISTICS
in externen Tabellen werden in Azure SQL-Datenbank nicht unterstützt.
Beispiele
Die Transact-SQL-Codebeispiele in diesem Artikel verwenden die AdventureWorks2022
- oder AdventureWorksDW2022
-Beispieldatenbank, die Sie von der Homepage Microsoft SQL Server Samples and Community Projects herunterladen können.
A. Verwenden von CREATE STATISTICS mit SAMPLE number PERCENT
Im folgenden Beispiel wird die ContactMail1
-Statistik erstellt. Dabei wird eine zufällige Stichprobe von 5 Prozent aus den Spalten BusinessEntityID
und EmailPromotion
der Tabelle Person
in der AdventureWorks2022-Datenbank verwendet.
CREATE STATISTICS ContactMail1
ON Person.Person (BusinessEntityID, EmailPromotion)
WITH SAMPLE 5 PERCENT;
B. Verwenden von CREATE STATISTICS mit FULLSCAN und NORECOMPUTE
Im folgenden Beispiel werden die NamePurchase
-Statistiken für alle Zeilen in der BusinessEntityID
-Spalte und der EmailPromotion
-Spalte der Person
-Tabelle erstellt. Dabei wird die automatische Neuberechnung von Statistiken deaktiviert.
CREATE STATISTICS NamePurchase
ON AdventureWorks2022.Person.Person (BusinessEntityID, EmailPromotion)
WITH FULLSCAN, NORECOMPUTE;
C. Erstellen gefilterter Statistiken mithilfe von CREATE STATISTICS
Im folgenden Beispiel wird die gefilterte Statistik ContactPromotion1
erstellt. Die Datenbank-Engine nimmt 50 Prozent der Daten in die Stichprobe auf und wählt dann die Zeilen aus, in denen EmailPromotion
gleich 2 ist.
CREATE STATISTICS ContactPromotion1
ON Person.Person (BusinessEntityID, LastName, EmailPromotion)
WHERE EmailPromotion = 2
WITH SAMPLE 50 PERCENT;
GO
D: Erstellen von Statistiken für eine externe Tabelle
Sie müssen beim Erstellen von Statistiken für eine externe Tabelle abgesehen von der Bereitstellung einer Liste der Spalten lediglich entscheiden, ob die Statistiken durch Stichprobenentnahme aus den Zeilen oder durch einen Scan aller Zeilen erstellt werden soll. CREATE
und DROP STATISTICS
in externen Tabellen werden in Azure SQL-Datenbank nicht unterstützt.
Da SQL Server Daten aus der externen Tabelle in eine temporäre Tabelle importiert, um Statistiken zu erstellen, nimmt die FULL SCAN-Option wesentlich mehr Zeit in Anspruch. Bei einer großen Tabelle ist die Standardmethode für die Stichprobenentnahme in der Regel ausreichend.
--Create statistics on an external table and use default sampling.
CREATE STATISTICS CustomerStats1 ON DimCustomer (CustomerKey, EmailAddress);
--Create statistics on an external table and scan all the rows
CREATE STATISTICS CustomerStats1 ON DimCustomer (CustomerKey, EmailAddress) WITH FULLSCAN;
E. Verwenden von CREATE STATISTICS mit FULLSCAN und PERSIST_SAMPLE_PERCENT
Im folgenden Beispiel werden die NamePurchase
Statistiken für alle Zeilen und BusinessEntityID
EmailPromotion
Spalten der Person
Tabelle erstellt und für alle nachfolgenden Aktualisierungen, die keinen Samplingprozentsatz explizit angeben, ein Samplingprozentsatz von 100 Prozent festgelegt.
CREATE STATISTICS NamePurchase
ON AdventureWorks2022.Person.Person (BusinessEntityID, EmailPromotion)
WITH FULLSCAN, PERSIST_SAMPLE_PERCENT = ON;
In den Beispielen wird die Datenbank „AdventureWorksDW“ verwendet.
F. Erstellen von Statistiken für zwei Spalten
Im folgenden Beispiel werden die CustomerStats1
-Statistiken basierend auf den Spalten CustomerKey
und EmailAddress
der Tabelle DimCustomer
erstellt. Die Statistiken werden basierend auf einer statistisch relevanten Stichprobenentnahme der Zeilen in der Customer
-Tabelle erstellt.
CREATE STATISTICS CustomerStats1 ON DimCustomer (CustomerKey, EmailAddress);
G. Erstellen von Statistiken mithilfe eines vollständigen Scans
Im folgenden Beispiel wird die Statistik CustomerStatsFullScan
basierend auf allen Zeilen in der Tabelle DimCustomer
erstellt.
CREATE STATISTICS CustomerStatsFullScan
ON DimCustomer (CustomerKey, EmailAddress) WITH FULLSCAN;
H. Erstellen von Statistiken durch Angeben des Stichprobenprozentsatzes
Im folgenden Beispiel wird die Statistik CustomerStatsSampleScan
basierend auf einem Scan von 50 Prozent der Zeilen in der Tabelle DimCustomer
erstellt.
CREATE STATISTICS CustomerStatsSampleScan
ON DimCustomer (CustomerKey, EmailAddress) WITH SAMPLE 50 PERCENT;
I. 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.
CREATE STATISTICS CustomerStats1 ON DimCustomer (CustomerKey, EmailAddress) WITH AUTO_DROP = ON
Verwenden Sie die Spalte auto_drop
in sys.stats, um die Auto-Drop-Einstellung in vorhandenen Statistiken auszuwerten:
SELECT object_id, [name], auto_drop
FROM sys.stats;