CREATE STATISTICS (Transact-SQL)

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed InstanceAzure Synapse AnalyticsSQL Analytics-Endpunkt in Microsoft FabricWarehouse in Microsoft Fabric

Erstellt Abfrageoptimierungsstatistiken in einer oder mehreren Spalten einer Tabelle, einer indizierten Sicht oder einer externen Tabelle. Bei den meisten Abfragen generiert der Abfrageoptimierer automatisch die notwendigen Statistiken für einen hochwertigen Abfrageplan; in einigen Fällen müssen Sie weitere Statistiken mithilfe von CREATE STATISTICS erstellen oder 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 Statistiken in Microsoft Fabric.

Transact-SQL-Syntaxkonventionen

Syntax

-- Syntax for SQL Server and Azure SQL Database
-- 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_contant ]
-- Syntax for Azure Synapse Analytics and Parallel Data Warehouse 
  
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 for 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
      }
    ]
[;]

Hinweis

Informationen zum Anzeigen der Transact-SQL-Syntax für SQL Server 2014 oder früher finden Sie unter Dokumentation zu früheren Versionen.

Argumente

statistics_name

Der Name der zu erstellenden Statistik.

table_or_indexed_view_name

Der Name der Tabelle, der indizierten Sicht oder der externen Tabelle, für die die Statistik erstellt werden soll. 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 DARITHABORT-Datenbankeinstellung und die QUOTED_IDENTIFIER-Datenbankeinstellung auf ON festgelegt sind.

  • 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. Im Filterprädikat werden einfache Vergleichsoperatoren verwendet. Es darf darin nicht auf eine berechnete Spalte, eine UDT-Spalte, eine Spalte mit einem räumlichen Datentyp oder eine Spalten mit dem hierarchyID-Datentyp verwiesen werden. Vergleiche mit NULL-Literalen sind mit den Vergleichsoperatoren nicht zulässig. Verwenden Sie stattdessen den IS NULL-Operator und den IS NOT NULL-Operator.

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 Filterprädikaten finden Sie unter Create Filtered Indexes (Erstellen gefilterter Indizes).

FULLSCAN

Gilt für: SQL Server 2016 (13.x) (ab SQL Server 2016 (13.x) SP1 CU4) und höher (ab SQL Server 2017 (14.x) CU1)

Berechnet die Statistiken, indem alle Zeilen überprüft werden. FULLSCAN und SAMPLE 100 PERCENT führen zu gleichen Ergebnissen. FULLSCAN kann nicht in Verbindung 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 einspaltige FULLSCAN- und einspaltige SAMPLE-basierte Statistiken unterstützt. Wenn keine Option angegeben ist, werden FULLSCAN-Statistiken erstellt.

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 Erstellen von Statistiken verwendet werden sollen. 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 automatisch Stichproben verwendet und die statistisch signifikante Stichprobengröße ermittelt, wie zum Erstellen hochwertiger Abfragepläne erforderlich.

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 0 ROWS angegeben ist, wird das Statistikobjekt zwar erstellt, enthält aber keine Statistikdaten.

In Warehouse in Microsoft Fabric werden nur einspaltige FULLSCAN- und einspaltige SAMPLE-basierte Statistiken unterstützt. Wenn keine Option angegeben ist, werden FULLSCAN-Statistiken erstellt.

PERSIST_SAMPLE_PERCENT = { ON | OFF }

Bei ON behalten die Statistiken den bei der Erstellung angegebenen Prozentsatz für die Stichprobenentnahme für nachfolgende Updates bei, die keinen expliziten Prozentsatz für die Stichprobenentnahme angeben. 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.

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

Deaktiviert die AUTO_UPDATE_STATISTICS-Option zur automatischen Statistikaktualisierung 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.

Entfernen Sie die Statistiken mit DROP STATISTICS, und führen Sie dann CREATE STATISTICS ohne die NORECOMPUTE-Option aus, um Statistikupdates wieder zu aktivieren.

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 (Transact-SQL). 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öher.

Bei ON wird die Statistik pro Partition erstellt. Bei OFF werden Statistiken für alle Partitionen kombiniert. 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: Azure SQL-Datenbank, Azure SQL Managed Instance und beginnt mit SQL Server 2022 (16.x)

Bei Versionen vor SQL Server 2022 (16.x) können diese Statistikobjekte, wenn Statistiken von einem Benutzer- oder Drittanbietertool für eine Benutzerdatenbank erstellt werden, Schemaänderungen blockieren oder stören, die von der Kundschaft gewünscht werden.

Ab SQL Server 2022 (16.x) ist die Option AUTO_DROP standardmäßig für alle neuen und migrierten Datenbanken aktiviert. Die Eigenschaft AUTO_DROP ermöglicht das Erstellen von Statistikobjekten derart, dass eine Schemaänderung nicht durch das Statistikobjekt blockiert wird, sondern dass die Statistiken bei Bedarf gelöscht werden. Auf diese Weise verhalten sich manuell erstellte Statistiken mit aktivierter Option AUTO_DROP wie automatisch erstellte Statistiken.

Hinweis

Wenn Sie versuchen, die Eigenschaft Auto_Drop für automatisch erstellte Statistiken festzulegen oder zu deaktivieren, können Fehler auftreten. Automatisch erstellte Statistiken verwenden immer die Option 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. Beim Wiederherstellen einer Datenbank auf SQL Server 2022 (16.x) aus einer früheren Version empfiehlt es sich, sp_updatestats für die Datenbank auszuführen, indem Sie die richtigen Metadaten für das AUTO_DROP-Feature der Statistik festlegen.

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. Bei einer großen externen Tabelle ist es wesentlich schneller, die Standardstichprobenentnahme statt der FULL SCAN-Option 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 dazu, wann UPDATE STATISTICS verwendet werden sollte, 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. Überlegen Sie genau, welche Vorgänge Sie für Tabellenspalten ausführen, bevor Sie eine gefilterte Statistik erstellen, da Sie die Definition einer Tabellenspalte, die für ein Prädikat einer gefilterten Statistik definiert wurde, nicht löschen, umbenennen oder ändern können.

Einschränkungen

  • 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 Option MAXDOP ist nicht mit den Optionen STATS_STREAM, ROWCOUNT und PAGECOUNT kompatibel.
  • Die Option MAXDOP ist, falls verwendet, durch die Einstellung „MAX_DOP“ der Resource Governor-Arbeitsauslastungsgruppe eingeschränkt.
  • CREATE und DROP STATISTICS werden nicht auf externen Tabellen in Azure SQL-Datenbank unterstützt.

Beispiele

In den Beispielen wird die Datenbank AdventureWorks verwendet.

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 werden nicht auf externen Tabellen in Azure SQL-Datenbank 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 in den Spalten BusinessEntityID und EmailPromotion der Tabelle Person erstellt. Zudem wird für alle nachfolgenden Updates, die keinen expliziten Prozentsatz für die Stichprobenentnahme angeben, ein Prozentsatz von 100 Prozent für die Stichprobenentnahme 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;

Nächste Schritte