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. CREATE STATISTICS kann mithilfe von tempdb die Stichprobenzeilen zum Erstellen von Statistiken sortieren.

Weitere Informationen zu Statistiken, einschließlich der Verwendung von CREATE STATISTICS, finden Sie unter Statistik.

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-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 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 bei 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 Erstellen 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 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 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 Statistikupdates für statistics_name ab und deaktiviert zukünftige Updates.

    Um Statistikupdates 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 Statistikupdates finden Sie unter Statistik.

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

Hinweise

Sie können bis zu 32 Spalten pro Statistikobjekt auflisten.

Verwendung von CREATE STATISTICS

Weitere Informationen zur Verwendung von CREATE STATISTICS finden Sie unter Statistik.

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.

Berechtigungen

Erfordert die ALTER TABLE-Berechtigung, oder der Benutzer muss Besitzer der Tabelle oder indizierten Sicht bzw. Mitglied der festen Datenbankrolle db_ddladmin sein.

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 BusinessEntityID und EmailPromotion aus der Tabelle Contact der AdventureWorks-Datenbank verwendet.

USE AdventureWorks2012;
GO
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 ContactMail2-Statistiken für alle Zeilen in der BusinessEntityID-Spalte und der EmailPromotion-Spalte der Contact-Tabelle erstellt. Dabei wird die automatische Neuberechnung von Statistiken deaktiviert.

CREATE STATISTICS NamePurchase
    ON AdventureWorks2012.Person.Person (BusinessEntityID, EmailPromotion)
    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 AdventureWorks2012;
GO
IF EXISTS (SELECT name FROM sys.stats
    WHERE name = N'ContactPromotion1'
    AND object_id = OBJECT_ID(N'Person.Person'))
DROP STATISTICS Person.Person.ContactPromotion1
GO
CREATE STATISTICS ContactPromotion1
    ON Person.Person (BusinessEntityID, LastName, EmailPromotion)
WHERE EmailPromotion = 2
WITH SAMPLE 50 PERCENT;
GO

Siehe auch

Verweis

UPDATE STATISTICS (Transact-SQL)

sp_updatestats (Transact-SQL)

DBCC SHOW_STATISTICS (Transact-SQL)

DROP STATISTICS (Transact-SQL)

sys.stats (Transact-SQL)

sys.stats_columns (Transact-SQL)

Konzepte

Statistik