CREATE STATISTICS (Transact-SQL)

Erstellt Abfrageoptimierungsstatistiken, einschließlich gefilterter Statistiken, für mindestens eine Spalte einer Tabelle oder indizierten Sicht. 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.

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.

Weitere Informationen zu Statistiken, einschließlich der Verwendung von CREATE STATISTICS, finden Sie unter Verwenden von Statistiken zum Verbessern der Abfrageleistung.

Themenlink (Symbol)Transact-SQL-Syntaxkonventionen

Syntax

CREATE STATISTICS statistics_name 
ON { table_or_indexed_view_name } ( column [ ,...n ] ) 
    [ WHERE <filter_predicate> ]
    [ WITH 
        [ [ FULLSCAN 
          | SAMPLE number { PERCENT | ROWS } 
          | STATS_STREAM = stats_stream ] [ , ] ] 
        [ NORECOMPUTE ] 
    ] ;

<filter_predicate> ::= 
    <conjunct> [AND <conjunct>]

<conjunct> ::=
    <disjunct> | <comparison>

<disjunct> ::=
        column_name IN (constant ,…)

<comparison> ::=
        column_name <comparison_op> constant

<comparison_op> ::=
    IS | IS NOT | = | <> | != | > | >= | !> | < | <= | !<

Argumente

  • statistics_name
    Der Name der zu erstellenden Statistik.

  • table_or_indexed_view_name
    Der Name der Tabelle oder indizierten Sicht, für die die Statistik erstellt werden soll. Statistiken können durch Angabe eines qualifizierten Tabellennamens für Tabellen oder indizierte Sichten in einer anderen Datenbank erstellt werden.

  • column [ ,…n]
    Gibt die Schlüsselspalte oder Liste der Schlüsselspalten an, für die die Statistik erstellt wird. 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-benutzerdefinierten 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. Weitere Informationen zum Erstellen von Spalten des CLR-benutzerdefinierten Typs finden Sie unter Arbeiten mit CLR-benutzerdefinierten Typen.

    Die maximal zulässige Größe der Werte kombinierter Spalten beträgt 900 Bytes.

  • 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 wird eine einfache Vergleichslogik verwendet. Es darf darin nicht auf eine berechnete Spalte, eine UDT-Spalte, eine Spalte mit einem räumlichen Datentyp oder eine Spalte 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 Richtlinien für den Entwurf gefilterter Indizes.

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

  • SAMPLE number { 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 number Werte von 0 bis 100 annehmen, für ROWS kann number Werte 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 Spezialfä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 FULLSCAN-Option 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 erstellt, es enthält jedoch keine Statistikdaten.

  • 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 Statistikaktualisierungen für statistics_name ab und deaktiviert zukünftige Aktualisierungen.

    Um Statistikaktualisierungen wieder zu aktivieren, entfernen Sie die Statistiken mit DROP STATISTICS und führen dann CREATE STATISTICS ohne die NORECOMPUTE-Option aus.

    VorsichtshinweisVorsicht

    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). Weitere Informationen zum Deaktivieren und erneuten Aktivieren von Statistikaktualisierungen finden Sie unter Verwenden von Statistiken zum Verbessern der Abfrageleistung.

  • STATS_STREAM **=**stats_stream
    Nur für Informationszwecke identifiziert. Nicht unterstützt. Zukünftige Kompatibilität wird nicht sichergestellt.

Hinweise

In der folgenden Tabelle ist die jeweils maximale Anzahl für die Kategorien angegeben, die sich auf Statistiken beziehen.

Statistikkategorien

Maximum

Spalten pro Statistikobjekt

32

Für Indizes erstellte Statistiken

1 pro Index und 1000 pro Tabelle

Für Spalten erstellte Statistiken

30.000 pro Tabelle

Wann CREATE STATISTICS verwendet werden sollte

Weitere Informationen dazu, wann CREATE STATISTICS verwendet werden sollte, finden Sie unter Verwenden von Statistiken zum Verbessern der Abfrageleistung.

Verweisen auf Abhängigkeiten für gefilterte Statistiken

Die sys.sql_expression_dependencies-Katalogsicht kennzeichnet jede Spalte im Prädikat der gefilterten Statistik 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.

Berechtigungen

Zum Erstellen von Statistiken muss der Benutzer Besitzer der Tabelle oder indizierten Sicht sein, oder der Benutzer muss Mitglied einer der folgenden Rollen sein: feste Serverrolle sysadmin, feste Datenbankrolle db_owner oder feste Datenbankrolle db_ddladmin.

Beispiele

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 der Spalten ContactID und EmailAddress aus der Tabelle Contact der AdventureWorks-Datenbank verwendet.

USE AdventureWorks;
GO
CREATE STATISTICS ContactMail1
    ON Person.Contact (ContactID, EmailAddress)
    WITH SAMPLE 5 PERCENT;

B. Verwenden von CREATE STATISTICS mit FULLSCAN und NORECOMPUTE

Im folgenden Beispiel werden die ContactMail2-Statistiken für alle Zeilen in der ContactID-Spalte und der EmailAddress-Spalte der Contact-Tabelle erstellt. Dabei wird die automatische Neuberechnung von Statistiken deaktiviert.

CREATE STATISTICS NamePurchase
    ON AdventureWorks.Person.Contact (ContactID, EmailAddress)
    WITH FULLSCAN, NORECOMPUTE;

C. Erstellen gefilterter Statistiken mithilfe von CREATE STATISTICS

Im folgenden Beispiel wird die gefilterte Statistik ContactPromotion1 erstellt. Das Database Engine (Datenbankmodul) nimmt 50 Prozent der Daten in die Stichprobe auf und wählt dann die Zeilen aus, in denen EmailPromotion gleich 2 ist.

USE AdventureWorks;
GO
IF EXISTS (SELECT name FROM sys.stats
    WHERE name = N'ContactPromotion1'
    AND object_id = OBJECT_ID(N'Person.Contact'))
DROP STATISTICS Person.Contact.ContactPromotion1
GO
CREATE STATISTICS ContactPromotion1
    ON Person.Contact (ContactID, EmailAddress, EmailPromotion)
WHERE EmailPromotion = 2
WITH SAMPLE 50 PERCENT;
GO

Änderungsverlauf

Aktualisierter Inhalt

Das gesamte Dokument wurde überarbeitet, um die Genauigkeit zu verbessern.

Das Thema verweist auf neuen Statistikinhalt im Thema Verwenden von Statistiken zum Verbessern der Abfrageleistung.