StatistikStatistics

Dieses Thema gilt für: JaSQL ServerJaAzure SQL-DatenbankJaAzure SQL Data Warehouse Ja Parallel DatawarehouseTHIS TOPIC APPLIES TO: yesSQL ServeryesAzure SQL DatabaseyesAzure SQL Data Warehouse yesParallel Data Warehouse Der Abfrageoptimierer verwendet Statistiken zum Erstellen von Abfrageplänen, die die Abfrageleistung verbessern. The Query Optimizer uses statistics to create query plans that improve query performance. 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 erstellen oder den Abfrageentwurf ändern, um optimale Ergebnisse zu erzielen.For most queries, the Query Optimizer already generates the necessary statistics for a high quality query plan; in some cases, you need to create additional statistics or modify the query design for best results. Dieses Thema enthält eine Erläuterung von Statistikkonzepten sowie Richtlinien zur effektiven Verwendung von Abfrageoptimierungsstatistiken.This topic discusses statistics concepts and provides guidelines for using query optimization statistics effectively.

Komponenten und KonzepteComponents and Concepts

StatistikStatistics

Statistiken zur Abfrageoptimierung sind Blobs (Binary Large Objects), die statistische Informationen über die Verteilung von Werten in Spalten einer Tabelle oder indizierten Sicht enthalten.Statistics for query optimization are binary large objects (BLOBs) that contain statistical information about the distribution of values in one or more columns of a table or indexed view. Der Abfrageoptimierer verwendet diese Statistiken, um die Kardinalität oder Anzahl von Zeilen im Abfrageergebnis zu schätzen.The Query Optimizer uses these statistics to estimate the cardinality, or number of rows, in the query result. Diese Kardinalitätsschätzungen ermöglichen es dem Abfrageoptimierer, einen hochwertigen Abfrageplan zu erstellen.These cardinality estimates enable the Query Optimizer to create a high-quality query plan. Beispielsweise kann der Abfrageoptimierer Kardinalitätsschätzungen verwenden, um statt des ressourcenintensiveren Index Scan-Operators den Index Seek-Operator auszuwählen und auf diese Weise die Abfrageleistung zu verbessern.For example, depending on your predicates, the Query Optimizer could use cardinality estimates to choose the index seek operator instead of the more resource-intensive index scan operator, and in doing so improve query performance.

Jedes Statistikobjekt wird für eine Liste mit mindestens einer Tabellenspalte erstellt und enthält ein Histogramm, das die Verteilung von Werten in der ersten Spalte anzeigt.Each statistics object is created on a list of one or more table columns and includes a histogram displaying the distribution of values in the first column. Statistikobjekte, die sich auf mehrere Spalten beziehen, enthalten außerdem statistische Informationen über die spaltenübergreifende Korrelation von Werten.Statistics objects on multiple columns also store statistical information about the correlation of values among the columns. Diese Korrelationsstatistiken oder Dichtenwerden von der Anzahl unterschiedlicher Zeilen mit Spaltenwerten abgeleitet.These correlation statistics, or densities, are derived from the number of distinct rows of column values.

HistogrammHistogram

Ein Histogramm misst die Häufigkeit des Vorkommens für jeden unterschiedlichen Wert in einem Dataset.A histogram measures the frequency of occurrence for each distinct value in a data set. Der Abfrageoptimierer berechnet ein Histogramm für die Spaltenwerte in der ersten Schlüsselspalte des Statistikobjekts und wählt die Spaltenwerte aus, indem statistische Zeilenstichproben entnommen werden oder indem ein vollständiger Scan aller Zeilen in der Tabelle oder Sicht ausgeführt wird.The query optimizer computes a histogram on the column values in the first key column of the statistics object, selecting the column values by statistically sampling the rows or by performing a full scan of all rows in the table or view. Wenn das Histogramm anhand einer Gruppe von Zeilenstichproben erstellt wird, handelt es sich bei der gespeicherten Gesamtzahl von Zeilen und unterschiedlichen Werten um Schätzungen, die keine ganzen Zahlen sein müssen.If the histogram is created from a sampled set of rows, the stored totals for number of rows and number of distinct values are estimates and do not need to be whole integers.

Hinweis

Histogramme werden in SQL ServerSQL Server nur für eine einzige Spalte erstellt, nämlich für die erste der Schlüsselspalten des Statistikobjekts.Histograms in SQL ServerSQL Server are only built for a single column—the first column in the set of key columns of the statistics object.

Zum Erstellen des Histogramms sortiert der Abfrageoptimierer die Spaltenwerte, berechnet die Anzahl der Werte, die den einzelnen unterschiedlichen Spaltenwerten entsprechen, und aggregiert die Spaltenwerte dann in maximal 200 zusammenhängenden Histogrammschritten.To create the histogram, the query optimizer sorts the column values, computes the number of values that match each distinct column value and then aggregates the column values into a maximum of 200 contiguous histogram steps. Jeder Histogrammschritt umfasst einen Bereich von Spaltenwerten gefolgt von einem oberen Spaltengrenzwert.Each histogram step includes a range of column values followed by an upper bound column value. Der Bereich enthält alle möglichen Spaltenwerte zwischen den Begrenzungswerten, ohne die Begrenzungswerte selbst.The range includes all possible column values between boundary values, excluding the boundary values themselves. Der niedrigste der sortierten Spaltenwerte ist der obere Grenzwert für den ersten Histogrammschritt.The lowest of the sorted column values is the upper boundary value for the first histogram step.

SQL ServerSQL Server erstellt das Histogramm aus den sortierten Spaltenwerten in drei Schritten:In more detail, SQL ServerSQL Server creates the histogram from the sorted set of column values in three steps:

  • Initialisierung des Histogramms: Im ersten Schritt wird eine Wertesequenz verarbeitet, die am Anfang der sortierten Menge beginnt, und bis zu 200 Werte von range_high_key, equal_rows, range_rows, und distinct_range_rows werden erfasst (range_rows und distinct_range_rows sind während dieses Schritts immer 0).Histogram initialization: In the first step, a sequence of values starting at the beginning of the sorted set is processed, and up to 200 values of range_high_key, equal_rows, range_rows, and distinct_range_rows are collected (range_rows and distinct_range_rows are always zero during this step). Der erste Schritt ist abgeschlossen, wenn alle Eingaben erschöpft sind oder 200 Werte gefunden wurden.The first step ends either when all input has been exhausted, or when 200 values have been found.
  • Scannen mit Bucketzusammenführung: Jeder zusätzliche Wert aus der führenden Spalte des Statistikschlüssels wird im zweiten Schritt in sortierter Reihenfolge verarbeitet. Jeder nachfolgende Wert wird entweder zum letzten Bereich hinzugefügt, oder es wird am Ende ein neuer Bereich erstellt (dies ist möglich, da die Eingabewerte sortiert sind).Scan with bucket merge: Each additional value from the leading column of the statistics key is processed in the second step, in sorted order; each successive value is either added to the last range or a new range at the end is created (this is possible because the input values are sorted). Wenn ein neuer Bereich erstellt wird, wird ein Paar der vorhandenen benachbarten Bereiche zu einem einzelnen Bereich reduziert.If a new range is created, then one pair of existing, neighboring ranges is collapsed into a single range. Dieses Bereichspaar wird ausgewählt, um den Verlust von Informationen zu minimieren.This pair of ranges is selected in order to minimize information loss. Diese Methode verwendet einen Algorithmus für die maximale Differenz, um die Anzahl von Schritten im Histogramm zu minimieren und gleichzeitig die Differenz zwischen den Begrenzungswerten zu maximieren.This method uses a maximum difference algorithm to minimize the number of steps in the histogram while maximizing the difference between the boundary values. Die Anzahl von Schritten nach dem Reduzieren von Bereichen bleibt in diesem Schritt bei 200.The number of steps after collapsing ranges stays at 200 throughout this step.
  • Konsolidierung des Histogramms: Im dritten Schritt können weitere Bereiche reduziert werden, wenn keine erhebliche Menge an Informationen verloren geht.Histogram consolidation: In the third step, more ranges may be collapsed if a significant amount of information is not lost. Die Anzahl von Histogrammschritten kann geringer sein als die Anzahl unterschiedlicher Werte, auch bei Spalten mit weniger als 200 Grenzpunkten.The number of histogram steps can be fewer than the number of distinct values, even for columns with fewer than 200 boundary points. Wenn jede Spalte mehr als 200 eindeutige Werte enthält, kann das Histogramm daher weniger als 200 Schritte enthalten.Therefore, even if the column has more than 200 unique values, the histogram may have less than 200 steps. Für eine Spalte, die nur aus eindeutigen Werten besteht, enthält das konsolidierte Histogramm mindestens drei Schritte.For a column consisting of only unique values, then the consolidated histogram will have a minimum of three steps.

Hinweis

Wenn das Histogramm mithilfe eines Beispiels statt mit der Option „Fullscan“ erstellt wurde, werden die Werte von equal_rows, range_rows, distinct_range_rows und average_range_rows geschätzt und müssen keine ganzen Zahlen sein.If the histogram has been built using a sample rather than fullscan, then the values of equal_rows, range_rows, and distinct_range_rows and average_range_rows are estimated, and therefore they do not need to be whole integers.

Das folgende Diagramm zeigt ein Histogramm mit sechs Schritten.The following diagram shows a histogram with six steps. Der Bereich links vom ersten oberen Grenzwert ist der erste Schritt.The area to the left of the first upper boundary value is the first step.

Für jeden der vorherigen Histogrammschritt gilt:For each histogram step above:

  • Eine fett formatierte Zeile stellt den oberen Grenzwert (range_high_key) und die Häufigkeit des Vorkommens (equal_rows) dar.Bold line represents the upper boundary value (range_high_key) and the number of times it occurs (equal_rows)

  • Der einfarbige Bereich links von range_high_key stellt den Bereich der Spaltenwerte und die durchschnittliche Häufigkeit des Vorkommens der einzelnen Spaltenwerte (average_range_rows) dar.Solid area left of range_high_key represents the range of column values and the average number of times each column value occurs (average_range_rows). average_range_rows ist für den ersten Histogrammschritt immer 0.The average_range_rows for the first histogram step is always 0.

  • Gepunktete Linien stellen die als Stichprobe entnommenen Werte dar, die zum Schätzen der Gesamtanzahl der unterschiedlichen Werte im Bereich (distinct_range_rows) verwendet werden, sowie die Gesamtanzahl der Werte im Bereich (range_rows).Dotted lines represent the sampled values used to estimate total number of distinct values in the range (distinct_range_rows) and total number of values in the range (range_rows). Der Abfrageoptimierer verwendet range_rows und distinct_range_rows, um average_range_rows zu berechnen. Die als Stichprobe entnommenen Werte werden nicht gespeichert.The query optimizer uses range_rows and distinct_range_rows to compute average_range_rows and does not store the sampled values.

DichtevektorDensity Vector

Die Dichte enthält Informationen zur Anzahl von Duplikaten in einer bestimmten Spalte oder Spaltekombination und wird als 1/(Anzahl der unterschiedlichen Werte) berechnet.Density is information about the number of duplicates in a given column or combination of columns and it is calculated as 1/(number of distinct values). Der Abfrageoptimierer verwendet Dichten, um Kardinalitätsschätzungen für Abfragen zu erweitern, die mehrere Spalten aus derselben Tabelle oder indizierten Sicht zurückgeben.The query optimizer uses densities to enhance cardinality estimates for queries that return multiple columns from the same table or indexed view. Der Dichtevektor enthält eine Dichte für jedes Präfix von Spalten im Statistikobjekt.The density vector contains one density for each prefix of columns in the statistics object.

Hinweis

Die Häufigkeit enthält Informationen über das Auftreten der einzelnen unterschiedlichen Werte in der ersten Schlüsselspalte des Statistikobjekts und wird als Zeilenanzahl · Dichte berechnet.Frequency is information about the occurrence of each distinct value in the first key column of the statistics object, and is calculated as row count * density. In Spalten mit eindeutigen Werten kann eine maximale Häufigkeit von 1 gefunden werden.A maximum frequency of 1 can be found in columns with unique values.

Wenn ein Statistikobjekt beispielsweise die Schlüsselspalten CustomerId, ItemId und Price enthält, wird die Dichte für jedes der folgenden Spaltenpräfixe berechnet:For example, if a statistics object has the key columns CustomerId, ItemId and Price, density is calculated on each of the following column prefixes.

SpaltenpräfixColumn prefix Dichte berechnet fürDensity calculated on
(CustomerId)(CustomerId) Zeilen mit übereinstimmenden Werten für CustomerIdRows with matching values for CustomerId
(CustomerId, ItemId)(CustomerId, ItemId) Zeilen mit übereinstimmenden Werten für CustomerId und ItemIdRows with matching values for CustomerId and ItemId
(CustomerId, ItemId, Price)(CustomerId, ItemId, Price) Zeilen mit übereinstimmenden Werten für CustomerId, ItemId und PriceRows with matching values for CustomerId, ItemId, and Price

Gefilterte StatistikenFiltered Statistics

Gefilterte Statistiken können die Abfrageleistung für Abfragen verbessern, bei denen aus klar definierten Teilmengen von Daten ausgewählt wird.Filtered statistics can improve query performance for queries that select from well-defined subsets of data. Gefilterte Statistiken verwenden ein Filterprädikat, um die Teilmenge von Daten auszuwählen, die in der Statistik enthalten ist.Filtered statistics use a filter predicate to select the subset of data that is included in the statistics. Sorgfältig entworfene gefilterte Statistiken können den Abfrageausführungsplan im Vergleich zu Tabellenstatistiken verbessern.Well-designed filtered statistics can improve the query execution plan compared with full-table statistics. Weitere Informationen zum Filterprädikat finden Sie unter CREATE STATISTICS (Transact-SQL).For more information about the filter predicate, see CREATE STATISTICS (Transact-SQL). Weitere Informationen zum Zeitpunkt der Erstellung von gefilterten Statistiken finden Sie im Abschnitt Zeitpunkt der Erstellung von Statistiken in diesem Thema.For more information about when to create filtered statistics, see the When to Create Statistics section in this topic.

StatistikoptionenStatistics Options

Anhand von drei Optionen können Sie festlegen, wann und wie Statistiken erstellt und aktualisiert werden.There are three options that you can set that affect when and how statistics are created and updated. Diese Optionen werden nur auf Datenbankebene festgelegt.These options are set at the database level only.

AUTO_CREATE_STATISTICS (Option)AUTO_CREATE_STATISTICS Option

Ist die AUTO_CREATE_STATISTICS-Option zum automatischen Erstellen von Statistiken aktiviert, erstellt der Abfrageoptimierer nach Bedarf Statistiken für einzelne Spalten im Abfrageprädikat, um Kardinalitätsschätzungen für den Abfrageplan zu verbessern.When the automatic create statistics option, AUTO_CREATE_STATISTICS is ON, the Query Optimizer creates statistics on individual columns in the query predicate, as necessary, to improve cardinality estimates for the query plan. Diese Statistiken für einzelne Spalten werden für Spalten erstellt, die noch nicht über ein Histogramm in einem vorhandenen Statistikobjekt verfügen.These single-column statistics are created on columns that do not already have a histogram in an existing statistics object. Durch die AUTO_CREATE_STATISTICS-Option wird nicht festgelegt, ob Statistiken für Indizes erstellt werden.The AUTO_CREATE_STATISTICS option does not determine whether statistics get created for indexes. Durch diese Option werden auch keine gefilterten Statistiken generiert.This option also does not generate filtered statistics. Sie gilt ausschließlich für Statistiken für einzelne Spalten der gesamten Tabelle.It applies strictly to single-column statistics for the full table.

Erstellt der Abfrageoptimierer Statistiken als Ergebnis der Verwendung der AUTO_CREATE_STATISTICS-Option, beginnt der Statistikname mit _WA.When the Query Optimizer creates statistics as a result of using the AUTO_CREATE_STATISTICS option, the statistics name starts with _WA. Mithilfe der folgenden Abfrage können Sie bestimmen, ob der Abfrageoptimierer Statistiken für eine Abfrageprädikatsspalte erstellt hat.You can use the following query to determine if the Query Optimizer has created statistics for a query predicate column.

SELECT OBJECT_NAME(s.object_id) AS object_name,  
    COL_NAME(sc.object_id, sc.column_id) AS column_name,  
    s.name AS statistics_name  
FROM sys.stats AS s 
INNER JOIN sys.stats_columns AS sc  
    ON s.stats_id = sc.stats_id AND s.object_id = sc.object_id  
WHERE s.name like '_WA%'  
ORDER BY s.name;  

AUTO_UPDATE_STATISTICS (Option)AUTO_UPDATE_STATISTICS Option

Wenn die AUTO_UPDATE_STATISTICS-Option zum automatischen Update von Statistiken aktiviert ist, stellt der Abfrageoptimierer fest, wann Statistiken veraltet sein könnten, und aktualisiert diese Statistiken, sobald sie von einer Abfrage verwendet werden.When the automatic update statistics option, AUTO_UPDATE_STATISTICS is ON, the Query Optimizer determines when statistics might be out-of-date and then updates them when they are used by a query. Statistiken sind veraltet, wenn die Datenverteilung in der Tabelle oder indizierten Sicht durch die Vorgänge INSERT, UPDATE, DELETE oder MERGE geändert wurde.Statistics become out-of-date after insert, update, delete, or merge operations change the data distribution in the table or indexed view. Der Abfrageoptimierer stellt fest, wann Statistiken veraltet sein könnten, indem er die Anzahl von Datenänderungen seit der letzten Statistikaktualisierung ermittelt und sie mit einem Schwellenwert vergleicht.The Query Optimizer determines when statistics might be out-of-date by counting the number of data modifications since the last statistics update and comparing the number of modifications to a threshold. Der Schwellenwert basiert auf der Anzahl von Zeilen in der Tabelle oder indizierten Sicht.The threshold is based on the number of rows in the table or indexed view.

  • SQL Server 2014SQL Server 2014, SQL ServerSQL Server verwendet einen Schwellenwert basierend auf dem Prozentsatz der geänderten Zeilen.Up to SQL Server 2014SQL Server 2014, SQL ServerSQL Server uses a threshold based on the percent of rows changed. Dies ist unabhängig von der Anzahl der Zeilen in der Tabelle.This is regardless of the number of rows in the table. Der Schwellenwert lautet:The threshold is:

    • Wenn die Tabellenkardinalität zum Zeitpunkt der Statistikauswertung 500 oder weniger beträgt, wird nach jeweils 500 Änderungen eine Aktualisierung durchgeführt.If the table cardinality was 500 or less at the time statistics were evaluated, update for every 500 modifications.
    • Wenn die Tabellenkardinalität zum Zeitpunkt der Statistikauswertung über 500 liegt, wird nach jeweils 500 Änderungen + 20 Prozent eine Aktualisierung durchgeführt.If the table cardinality was above 500 at the time statistics were evaluated, update for every 500 + 20 percent of modifications.
  • Ab SQL Server 2016SQL Server 2016 und bei einem Kompatibilitätsgrad von unter 130 verwendet SQL ServerSQL Server einen abnehmenden dynamischen Schwellenwert für das Statistikupdate, der gemäß der Anzahl von Zeilen in der Tabelle angepasst wird.Starting with SQL Server 2016SQL Server 2016 and under the database compatibility level 130, SQL ServerSQL Server uses a decreasing, dynamic statistics update threshold that adjusts according to the number of rows in the table. Dieser berechnet sich als Quadratwurzel aus 1.000 multipliziert mit der aktuellen Tabellenkardinalität.This is calculated as the square root of 1,000 multiplied by the current table cardinality. Durch diese Änderung werden Statistiken für große Tabellen häufiger aktualisiert.With this change, statistics on large tables will be updated more often. Weist eine Datenbank jedoch einen Kompatibilitätsgrad unter 130 auf, dann gilt der Schwellenwert SQL Server 2014SQL Server 2014.However, if a database has a compatibility level below 130, then the SQL Server 2014SQL Server 2014 threshold applies.

Wichtig

Ab SQL Server 2008 R2SQL Server 2008 R2 bis SQL Server 2014SQL Server 2014 oder in SQL Server 2016SQL Server 2016 bis SQL Server 2017SQL Server 2017 verwenden Sie bei einem Kompatibilitätsgrad der Datenbank unter 130 das Ablaufverfolgungsflag 2371, und SQL ServerSQL Server verwendet dann einen abnehmenden dynamischen Schwellenwert für das Statistikupdate, der gemäß der Anzahl von Zeilen in der Tabelle angepasst wird.Starting with SQL Server 2008 R2SQL Server 2008 R2 through SQL Server 2014SQL Server 2014, or in SQL Server 2016SQL Server 2016 through SQL Server 2017SQL Server 2017 under database compatibility level lower than 130, use trace flag 2371 and SQL ServerSQL Server will use a decreasing, dynamic statistics update threshold that adjusts according to the number of rows in the table.

Bevor der Abfrageoptimierer eine Abfrage kompiliert und einen zwischengespeicherten Abfrageplan ausführt, sucht er nach veralteten Statistiken.The Query Optimizer checks for out-of-date statistics before compiling a query and before executing a cached query plan. Vor dem Kompilieren einer Abfrage ermittelt der Abfrageoptimierer anhand der Spalten, Tabellen und indizierten Sichten im Abfrageprädikat, welche Statistiken veraltet sein könnten.Before compiling a query, the Query Optimizer uses the columns, tables, and indexed views in the query predicate to determine which statistics might be out-of-date. Vor dem Ausführen eines zwischengespeicherten Abfrageplans überprüft das DatenbankmodulDatabase Engine , ob der Abfrageplan auf aktuelle Statistiken verweist.Before executing a cached query plan, the DatenbankmodulDatabase Engine verifies that the query plan references up-to-date statistics.

Die AUTO_UPDATE_STATISTICS-Option gilt für Statistikobjekte, die für Indizes, einzelne Spalten in Abfrageprädikaten und mit der CREATE STATISTICS -Anweisung generierte Statistiken erstellt wurden.The AUTO_UPDATE_STATISTICS option applies to statistics objects created for indexes, single-columns in query predicates, and statistics created with the CREATE STATISTICS statement. Diese Option gilt auch für gefilterte Statistiken.This option also applies to filtered statistics.

Weitere Informationen zur Steuerung von AUTO_UPDATE_STATISTICS finden Sie unter Steuern des Verhaltens der automatischen Statistikaktualisierung (AUTO_UPDATE_STATISTICS) in SQL Server.For more information about controlling AUTO_UPDATE_STATISTICS, see Controlling Autostat (AUTO_UPDATE_STATISTICS) behavior in SQL Server.

AUTO_UPDATE_STATISTICS_ASYNCAUTO_UPDATE_STATISTICS_ASYNC

Mit der AUTO_UPDATE_STATISTICS_ASYNC-Option für das asynchrone Statistikupdate wird festgelegt, ob der Abfrageoptimierer das synchrone oder asynchrone Statistikupdate verwendet.The asynchronous statistics update option, AUTO_UPDATE_STATISTICS_ASYNC, determines whether the Query Optimizer uses synchronous or asynchronous statistics updates. Die Option für das asynchrone Statistikupdate ist standardmäßig deaktiviert, sodass der Abfrageoptimierer Statistiken synchron aktualisiert.By default, the asynchronous statistics update option is OFF, and the Query Optimizer updates statistics synchronously. Die AUTO_UPDATE_STATISTICS_ASYNC-Option gilt für Statistikobjekte, die für Indizes, einzelne Spalten in Abfrageprädikaten und mit der CREATE STATISTICS -Anweisung generierte Statistiken erstellt wurden.The AUTO_UPDATE_STATISTICS_ASYNC option applies to statistics objects created for indexes, single columns in query predicates, and statistics created with the CREATE STATISTICS statement.

Hinweis

Um die Option für die asynchrone Statistikaktualisierung in SQL Server Management StudioSQL Server Management Studio auf der Seite Optionen des Fensters Datenbankeigenschaften festzulegen, müssen die beiden Optionen Statistik automatisch aktualisierenn und Statistik automatisch asynchron aktualisieren auf True festgelegt werden.To set the asynchronous statistics update option in SQL Server Management StudioSQL Server Management Studio, in the Options page of the Database Properties window, both Auto Update Statistics and Auto Update Statistics Asynchronously options need to be set to True.

Statistikaktualisierungen können entweder synchron (Standard) oder asynchron sein.Statistics updates can be either synchronous (the default) or asynchronous. Bei synchronen Statistikaktualisierungen werden Abfragen immer anhand aktueller Statistiken kompiliert und ausgeführt. Wenn Statistiken veraltet sind, wartet der Abfrageoptimierer auf aktualisierte Statistiken, bevor er die Abfrage kompiliert und ausführt.With synchronous statistics updates, queries always compile and execute with up-to-date statistics; When statistics are out-of-date, the Query Optimizer waits for updated statistics before compiling and executing the query. Bei asynchronen Statistikaktualisierungen werden Abfragen anhand vorhandener Statistiken kompiliert, auch wenn diese veraltet sind. Der Abfrageoptimierer könnte einen suboptimalen Abfrageplan auswählen, wenn die Statistiken beim Kompilieren der Abfrage veraltet sind.With asynchronous statistics updates, queries compile with existing statistics even if the existing statistics are out-of-date; The Query Optimizer could choose a suboptimal query plan if statistics are out-of-date when the query compiles. Wenn Abfragen nach dem Ausführen asynchroner Updates kompiliert werden, hat dies den Vorteil, dass für die Abfragen aktualisierte Statistiken verwendet werden.Queries that compile after the asynchronous updates have completed will benefit from using the updated statistics.

Verwenden Sie ggf. synchrone Statistiken, wenn Sie Vorgänge ausführen, die die Verteilung der Daten ändern, beispielsweise das Kürzen einer Tabelle oder das Ausführen eines Massenupdates für einen großen Zeilenprozentsatz.Consider using synchronous statistics when you perform operations that change the distribution of data, such as truncating a table or performing a bulk update of a large percentage of the rows. Wenn Sie nach dem Abschließen des Vorgangs die Statistiken nicht aktualisieren, wird mithilfe von synchronen Statistiken sichergestellt, dass Statistiken vor dem Ausführen von Abfragen über die geänderten Daten aktuell sind.If you do not update the statistics after completing the operation, using synchronous statistics will ensure statistics are up-to-date before executing queries on the changed data.

In den folgenden Szenarien empfiehlt sich die Verwendung asynchroner Statistiken, um besser vorhersagbare Antwortzeiten für Abfragen zu erzielen:Consider using asynchronous statistics to achieve more predictable query response times for the following scenarios:

  • Häufig werden von der Anwendung die gleichen Abfragen, ähnliche Abfragen bzw. ähnliche zwischengespeicherte Abfragepläne ausgeführt.Your application frequently executes the same query, similar queries, or similar cached query plans. Bei Verwendung asynchroner Statistikaktualisierungen können die Antwortzeiten für Abfragen vorhersagbarer sein als bei synchronen Statistikaktualisierungen, weil der Abfrageoptimierer eingehende Abfragen direkt ausführen kann, ohne auf aktuelle Statistiken zu warten.Your query response times might be more predictable with asynchronous statistics updates than with synchronous statistics updates because the Query Optimizer can execute incoming queries without waiting for up-to-date statistics. Dadurch wird verhindert, dass sich einige Abfragen verzögern und andere nicht.This avoids delaying some queries and not others.

  • In der Anwendung sind Timeouts bei Clientanforderungen aufgetreten, die dadurch verursacht werden, dass mindestens eine Abfrage auf aktualisierte Statistiken wartet.Your application has experienced client request time outs caused by one or more queries waiting for updated statistics. In einigen Fällen kann das Warten auf synchrone Statistiken dazu führen, dass Anwendungen mit kurzen Timeouts einen Fehler erzeugen.In some cases, waiting for synchronous statistics could cause applications with aggressive time outs to fail.

INCREMENTALINCREMENTAL

Wenn die Option INCREMENTAL von CREATE STATISTICS auf ON festgelegt ist, werden die Statistiken pro Partition erstellt.When INCREMENTAL option of CREATE STATISTICS is ON, the statistics created are per partition statistics. Bei OFF wird die Statistikstruktur gelöscht und die Statistik von SQL ServerSQL Server neu berechnet.When OFF, the statistics tree is dropped and SQL ServerSQL Server re-computes the statistics. Der Standardwert ist OFF.The default is OFF. Diese Einstellung überschreibt die INCREMENTAL-Eigenschaft auf Datenbankebene.This setting overrides the database level INCREMENTAL property. Weitere Informationen zum Erstellen von inkrementellen Statistiken finden Sie unter CREATE STATISTICS (Transact-SQL).For more information about creating incremental statistics, see CREATE STATISTICS (Transact-SQL). Weitere Informationen zum automatischen Erstellen von Statistiken pro Partition finden Sie unter Datenbankeigenschaften (Seite „Optionen“) und ALTER DATABASE SET Options (Transact-SQL) (Optionen für ALTER DATABASE SET (Transact-SQL)).For more information about creating per partition statistics automatically, see Database Properties (Options Page) and ALTER DATABASE SET Options (Transact-SQL).

Wenn einer umfangreichen Tabelle neue Partitionen hinzugefügt werden, sollte die Statistik aktualisiert werden, um die neuen Partitionen zu berücksichtigen.When new partitions are added to a large table, statistics should be updated to include the new partitions. Das Scannen der gesamten Tabelle (FULLSCAN- oder SAMPLE-Option) könnte jedoch ziemlich lange dauern.However the time required to scan the entire table (FULLSCAN or SAMPLE option) might be quite long. Außerdem ist das Scannen der gesamten Tabelle nicht erforderlich, da ggf. nur die Statistik der neuen Partitionen benötigt wird.Also, scanning the entire table isn't necessary because only the statistics on the new partitions might be needed. Durch die INCREMENTAL-Option werden nur Statistikdaten pro Partition erstellt und gespeichert. Beim Update werden nur die Statistiken der Partitionen aktualisiert, die eine neue Statistik erfordern.The incremental option creates and stores statistics on a per partition basis, and when updated, only refreshes statistics on those partitions that need new statistics

Wenn Statistiken pro Partition nicht unterstützt werden, wird die Option ignoriert und eine Warnung generiert.If per partition statistics are not supported the option is ignored and a warning is generated. Inkrementelle Statistiken werden für folgende Statistiktypen nicht unterstützt:Incremental stats are not supported for following statistics types:

  • Statistiken, die mit Indizes erstellt wurden, die über keine Partitionsausrichtung mit der Basistabelle verfügen.Statistics created with indexes that are not partition-aligned with the base table.
  • Statistiken, die für lesbare sekundäre Always On-Datenbanken erstellt wurden.Statistics created on Always On readable secondary databases.
  • Statistiken, die für schreibgeschützte Datenbanken erstellt wurden.Statistics created on read-only databases.
  • Statistiken, die für gefilterte Indizes erstellt wurden.Statistics created on filtered indexes.
  • Statistiken, die für Sichten erstellt wurden.Statistics created on views.
  • Statistiken, die für interne Tabellen erstellt wurden.Statistics created on internal tables.
  • Statistiken, die mit räumlichen Indizes oder XML-Indizes erstellt wurden.Statistics created with spatial indexes or XML indexes.

Gilt für: SQL Server 2014SQL Server 2014 bis SQL Server 2017SQL Server 2017.Applies to: SQL Server 2014SQL Server 2014 through SQL Server 2017SQL Server 2017.

Zeitpunkt der Erstellung von StatistikenWhen to create statistics

Der Abfrageoptimierer erstellt bereits Statistiken in der folgenden Weise:The Query Optimizer already creates statistics in the following ways:

  1. Bei der Indexerstellung berechnet der Abfrageoptimierer Statistiken für Indizes, die sich auf Tabellen oder Sichten beziehen.The Query Optimizer creates statistics for indexes on tables or views when the index is created. Diese Statistiken werden für die Schlüsselspalten des Indexes erstellt.These statistics are created on the key columns of the index. Wenn es sich um einen gefilterten Index handelt, erstellt der Abfrageoptimierer gefilterte Statistiken für die gleiche Teilmenge von Zeilen, die für den gefilterten Index angegeben wurden.If the index is a filtered index, the Query Optimizer creates filtered statistics on the same subset of rows specified for the filtered index. Weitere Informationen zu gefilterten Indizes finden Sie unter Erstellen gefilterter Indizes und CREATE INDEX (Transact-SQL).For more information about filtered indexes, see Create Filtered Indexes and CREATE INDEX (Transact-SQL).

  2. Der Abfrageoptimierer erstellt Statistiken für einzelne Spalten in Abfrageprädikaten, wenn AUTO_CREATE_STATISTICS aktiviert ist.The Query Optimizer creates statistics for single columns in query predicates when AUTO_CREATE_STATISTICS is on.

Bei den meisten Abfragen werden durch diese beiden Methoden zum Erstellen von Statistiken hochwertige Abfragepläne gewährleistet. In einigen Fällen können Sie Abfragepläne verbessern, indem Sie zusätzliche Statistiken mit der CREATE STATISTICS -Anweisung erstellen.For most queries, these two methods for creating statistics ensure a high-quality query plan; in a few cases, you can improve query plans by creating additional statistics with the CREATE STATISTICS statement. In diesen zusätzlichen Statistiken können Sie statistische Korrelationen aufzeichnen, die vom Abfrageoptimierer beim Erstellen von Statistiken für Indizes oder einzelne Spalten nicht berücksichtigt werden.These additional statistics can capture statistical correlations that the Query Optimizer does not account for when it creates statistics for indexes or single columns. Ihre Anwendung kann über zusätzliche statistische Korrelationen in den Tabellendaten verfügen, durch die der Abfrageoptimierer Abfragepläne verbessern kann, wenn sie für die Berechnung von Statistikobjekten zugrunde gelegt werden.Your application might have additional statistical correlations in the table data that, if calculated into a statistics object, could enable the Query Optimizer to improve query plans. Der Abfrageplan kann beispielsweise optimiert werden, indem gefilterte Statistiken für eine Teilmenge von Datenzeilen oder Statistiken für mehrere Spalten für Abfrageprädikatsspalten ausgeführt werden.For example, filtered statistics on a subset of data rows or multicolumn statistics on query predicate columns might improve the query plan.

Wenn Statistiken mit der CREATE STATISTICS-Anweisung erstellt werden, empfiehlt es sich, die AUTO_CREATE_STATISTICS-Option aktiviert zu lassen, damit der Abfrageoptimierer weiterhin routinemäßig Statistiken für einzelne Spalten für Abfrageprädikatsspalten erstellt.When creating statistics with the CREATE STATISTICS statement, we recommend keeping the AUTO_CREATE_STATISTICS option on so that the Query Optimizer continues to routinely create single-column statistics for query predicate columns. Weitere Informationen zu Abfrageprädikaten finden Sie unter Suchbedingung (Transact-SQL).For more information about query predicates, see Search Condition (Transact-SQL).

Wenn eine der folgenden Bedingungen zutrifft, können Sie die Erstellung von Statistiken mit der CREATE STATISTICS-Anweisung in Erwägung ziehen:Consider creating statistics with the CREATE STATISTICS statement when any of the following applies:

  • Der DatenbankmodulDatabase Engine -Optimierungsratgeber schlägt vor, Statistiken zu erstellen.The DatenbankmodulDatabase Engine Tuning Advisor suggests creating statistics.
  • Das Abfrageprädikat enthält mehrere korrelierende Spalten, die sich noch nicht im gleichen Index befinden.The query predicate contains multiple correlated columns that are not already in the same index.
  • Bei der Abfrageausführung wird aus einer Teilmenge von Daten ausgewählt.The query selects from a subset of data.
  • Statistiken für eine Abfrage fehlen.The query has missing statistics.

Das Abfrageprädikat enthält mehrere korrelierende SpaltenQuery Predicate contains multiple correlated columns

Wenn ein Abfrageprädikat mehrere Spalten mit spaltenübergreifenden Beziehungen und Abhängigkeiten enthält, könnte der Abfrageplan durch Statistiken für mehrere Spalten optimiert werden.When a query predicate contains multiple columns that have cross-column relationships and dependencies, statistics on the multiple columns might improve the query plan. Statistiken für mehrere Spalten enthalten spaltenübergreifende Korrelationsstatistiken, so genannte Dichten, die in Statistiken für einzelne Spalten nicht verfügbar sind.Statistics on multiple columns contain cross-column correlation statistics, called densities, that are not available in single-column statistics. Durch Dichten können Kardinalitätsschätzungen verbessert werden, wenn Abfrageergebnisse von Datenbeziehungen zwischen mehreren Spalten abhängig sind.Densities can improve cardinality estimates when query results depend on data relationships among multiple columns.

Wenn sich die Spalten bereits im gleichen Index befinden, ist das Statistikobjekt für mehrere Spalten bereits vorhanden und muss nicht manuell erstellt werden.If the columns are already in the same index, the multicolumn statistics object already exists and it is not necessary to create it manually. Wenn sich die Spalten noch nicht im gleichen Index befinden, können Sie Statistiken für mehrere Spalten erstellen, indem Sie einen Index für die Spalten anlegen oder die CREATE STATISTICS-Anweisung verwenden.If the columns are not already in the same index, you can create multicolumn statistics by creating an index on the columns or by using the CREATE STATISTICS statement. Zur Verwaltung eines Indexes werden mehr Systemressourcen benötigt als zur Verwaltung eines Statistikobjekts.It requires more system resources to maintain an index than a statistics object. Wenn die Anwendung keinen Index für mehrere Spalten erfordert, können Sie Systemressourcen sparen, indem Sie das Statistikobjekt erstellen, ohne den Index zu generieren.If the application does not require the multicolumn index, you can economize on system resources by creating the statistics object without creating the index.

Wenn Statistiken für mehrere Spalten erstellt werden, wirkt sich die Reihenfolge der Spalten in der Statistikobjektdefinition darauf aus, wie effektiv die Dichten beim Erstellen von Kardinalitätsschätzungen sind.When creating multicolumn statistics, the order of the columns in the statistics object definition affects the effectiveness of densities for making cardinality estimates. Im Statistikobjekt werden Dichten für jedes Präfix von Schlüsselspalten in der Statistikobjektdefinition gespeichert.The statistics object stores densities for each prefix of key columns in the statistics object definition. Weitere Informationen zu Dichten finden Sie im Abschnitt Dichte auf dieser Seite.For more information about densities, see Density section in this page.

Zum Erstellen von Dichten, die für Kardinalitätsschätzungen hilfreich sind, müssen die Spalten im Abfrageprädikat einem der Spaltenpräfixe in der Statistikobjektdefinition entsprechen.To create densities that are useful for cardinality estimates, the columns in the query predicate must match one of the prefixes of columns in the statistics object definition. Im Folgenden wird beispielsweise aus den Spalten LastName, MiddleNameund FirstNameein Objekt für eine Statistik für mehrere Spalten erstellt.For example, the following creates a multicolumn statistics object on the columns LastName, MiddleName, and FirstName.

USE AdventureWorks2012;  
GO  
IF EXISTS (SELECT name FROM sys.stats  
    WHERE name = 'LastFirst'  
    AND object_ID = OBJECT_ID ('Person.Person'))  
DROP STATISTICS Person.Person.LastFirst;  
GO  
CREATE STATISTICS LastFirst ON Person.Person (LastName, MiddleName, FirstName);  
GO  

In diesem Beispiel verfügt das Statistikobjekt LastFirst über Dichten für die folgenden Spaltenpräfixe: (LastName), (LastName, MiddleName) und (LastName, MiddleName, FirstName).In this example, the statistics object LastFirst has densities for the following column prefixes: (LastName), (LastName, MiddleName), and (LastName, MiddleName, FirstName). Für (LastName, FirstName) ist keine Dichte verfügbar.The density is not available for (LastName, FirstName). Wenn in der Abfrage LastName und FirstName ohne MiddleNameverwendet werden, ist die Dichte für Kardinalitätsschätzungen nicht verfügbar.If the query uses LastName and FirstName without using MiddleName, the density is not available for cardinality estimates.

Abfrage wählt aus einer Teilmenge von Daten ausQuery Selects from a subset of data

Wenn der Abfrageoptimierer Statistiken für einzelne Spalten und Indizes erstellt, berechnet er Statistiken für die Werte sämtlicher Zeilen.When the Query Optimizer creates statistics for single columns and indexes, it creates the statistics for the values in all rows. Wenn bei Abfragen aus einer Teilmenge von Zeilen ausgewählt wird und diese Teilmenge über eine eindeutige Datenverteilung verfügt, können Abfragepläne durch gefilterte Statistiken verbessert werden.When queries select from a subset of rows, and that subset of rows has a unique data distribution, filtered statistics can improve query plans. Sie können gefilterte Statistiken erstellen, indem Sie die CREATE STATISTICS-Anweisung mit der WHERE-Klausel verwenden, um den Filterprädikatausdruck zu definieren.You can create filtered statistics by using the CREATE STATISTICS statement with the WHERE clause to define the filter predicate expression.

Durch die Verwendung von AdventureWorks2012AdventureWorks2012 beispielsweise gehört jedes Produkt in der Production.Product-Tabelle zu einer von vier Kategorien in der Production.ProductCategory-Tabelle: Fahrräder, Bauteile, Bekleidung und Zubehör.For example, using AdventureWorks2012AdventureWorks2012, each product in the Production.Product table belongs to one of four categories in the Production.ProductCategory table: Bikes, Components, Clothing, and Accessories. Jede Kategorie verfügt über eine andere Datenverteilung für das Gewicht: Die Gewichte der Fahrräder reichen von 13,77 bis 30,0, die Gewichte der Bauteile reichen von 2,12 bis 1050,00 mit einigen NULL-Werten, die Gewichte der Bekleidung sind alle NULL, und die Gewichte des Zubehörs sind ebenfalls NULL.Each of the categories has a different data distribution for weight: bike weights range from 13.77 to 30.0, component weights range from 2.12 to 1050.00 with some NULL values, clothing weights are all NULL, and accessory weights are also NULL.

Bei den Fahrrädern liefern gefilterte Statistiken dem Abfrageoptimierer zu allen Fahrradgewichten genauere Statistikdaten und können die Abfrageplanqualität im Vergleich zu Tabellenstatistiken oder nicht vorhandenen Statistiken für die Weight-Spalte verbessern.Using Bikes as an example, filtered statistics on all bike weights will provide more accurate statistics to the Query Optimizer and can improve the query plan quality compared with full-table statistics or nonexistent statistics on the Weight column. Die Spalte mit dem Fahrradgewicht eignet sich besonders für gefilterte Statistiken, jedoch weniger für einen gefilterten Index, wenn nur relativ wenige Suchen nach Gewichtsangaben ausgeführt werden.The bike weight column is a good candidate for filtered statistics but not necessarily a good candidate for a filtered index if the number of weight lookups is relatively small. Die Leistungsvorteile, die gefilterte Indizes bei der Suche bieten, können die zusätzlichen Kosten für Wartung und Speicher, die mit der Implementierung eines gefilterten Indexes in der Datenbank verbunden sind, jedoch nicht aufwiegen.The performance gain for lookups that a filtered index provides might not outweigh the additional maintenance and storage cost for adding a filtered index to the database.

Durch die folgende Anweisung wird die gefilterte BikeWeights -Statistik für alle Unterkategorien von Fahrrädern erstellt.The following statement creates the BikeWeights filtered statistics on all of the subcategories for Bikes. Durch den gefilterten Prädikatausdruck werden Fahrräder definiert, indem alle Fahrradunterkategorien mit dem Vergleich Production.ProductSubcategoryID IN (1,2,3)aufgelistet werden.The filtered predicate expression defines bikes by enumerating all of the bike subcategories with the comparison Production.ProductSubcategoryID IN (1,2,3). Das Prädikat kann den Kategorienamen für Fahrräder nicht verwenden, da er in der Production.ProductCategory-Tabelle gespeichert ist; alle Spalten im Filterausdruck müssen sich in der gleichen Tabelle befinden.The predicate cannot use the Bikes category name because it is stored in the Production.ProductCategory table, and all columns in the filter expression must be in the same table.

USE AdventureWorks2012;
GO
IF EXISTS ( SELECT name FROM sys.stats
    WHERE name = 'BikeWeights'
    AND object_ID = OBJECT_ID ('Production.Product'))
DROP STATISTICS Production.Product.BikeWeights;
GO
CREATE STATISTICS BikeWeights
    ON Production.Product (Weight)
WHERE ProductSubcategoryID IN (1,2,3);
GO

Der Abfrageoptimierer kann die gefilterte Statistik für BikeWeights verwenden, um den Abfrageplan für die folgende Abfrage zu verbessern, bei der alle Fahrräder ausgewählt werden, deren Gewicht größer ist als 25.The Query Optimizer can use the BikeWeights filtered statistics to improve the query plan for the following query that selects all of the bikes that weigh more than 25.

SELECT P.Weight AS Weight, S.Name AS BikeName  
FROM Production.Product AS P  
    JOIN Production.ProductSubcategory AS S   
    ON P.ProductSubcategoryID = S.ProductSubcategoryID  
WHERE P.ProductSubcategoryID IN (1,2,3) AND P.Weight > 25  
ORDER BY P.Weight;  
GO  

Abfrage identifiziert fehlende StatistikenQuery identifies missing statistics

Wenn der Abfrageoptimierer aufgrund eines Fehlers oder eines anderen Ereignisses keine Statistiken erstellen kann, erstellt er den Abfrageplan ohne Verwendung von Statistiken.If an error or other event prevents the Query Optimizer from creating statistics, the Query Optimizer creates the query plan without using statistics. Der Abfrageoptimierer kennzeichnet die Statistik als nicht vorhanden und versucht beim nächsten Ausführen der Abfrage, die Statistik erneut zu generieren.The Query Optimizer marks the statistics as missing and attempts to regenerate the statistics the next time the query is executed.

Fehlende Statistiken werden als Warnungen angegeben (Tabellenname als rot formatierter Text), wenn der Ausführungsplan einer Abfrage mithilfe von SQL Server Management StudioSQL Server Management Studiografisch angezeigt wird.Missing statistics are indicated as warnings (table name in red text) when the execution plan of a query is graphically displayed using SQL Server Management StudioSQL Server Management Studio. Das Fehlen von Statistiken wird zudem angezeigt, wenn die Missing Column Statistics-Ereignisklasse mithilfe von SQL Server ProfilerSQL Server Profiler überwacht wird.Additionally, monitoring the Missing Column Statistics event class by using SQL Server ProfilerSQL Server Profiler indicates when statistics are missing. Weitere Informationen finden Sie unter Fehler und Warnungen-Ereigniskategorie (Datenbankmodul).For more information, see Errors and Warnings Event Category (Database Engine).

Wenn Statistiken fehlen, führen Sie die folgenden Schritte aus:If statistics are missing, perform the following steps:

Wenn Statistiken zu einer schreibgeschützten Momentaufnahme fehlen oder veraltet sind, erstellt und verwaltet das DatenbankmodulDatabase Engine temporäre Statistiken in tempdb.When statistics on a read-only database or read-only snapshot are missing or stale, the DatenbankmodulDatabase Engine creates and maintains temporary statistics in tempdb. Wenn das DatenbankmodulDatabase Engine temporäre Statistiken erstellt, wird dem Statistiknamen das _readonly_database_statistic-Suffix angefügt, um die temporären Statistiken von den dauerhaften Statistiken zu unterscheiden.When the DatenbankmodulDatabase Engine creates temporary statistics, the statistics name is appended with the suffix _readonly_database_statistic to differentiate the temporary statistics from the permanent statistics. Das Suffix _readonly_database_statistic ist für von SQL ServerSQL Server generierte Statistiken reserviert.The suffix _readonly_database_statistic is reserved for statistics generated by SQL ServerSQL Server. Skripts für die temporären Statistiken können erstellt und auf einer Datenbank mit Lese-/Schreibzugriff reproduziert werden.Scripts for the temporary statistics can be created and reproduced on a read-write database. Bei einer Skripterstellung ändert Management StudioManagement Studio das Suffix des Statistiknamens von _readonly_database_statistic in _readonly_database_statistic_scripted.When scripted, Management StudioManagement Studio changes the suffix of the statistics name from _readonly_database_statistic to _readonly_database_statistic_scripted.

Nur SQL ServerSQL Server kann temporäre Statistiken erstellen und aktualisieren.Only SQL ServerSQL Server can create and update temporary statistics. Sie können jedoch temporäre Statistiken löschen und Statistikeigenschaften mit den gleichen Tools überwachen, die Sie für dauerhafte Statistiken verwenden:However, you can delete temporary statistics and monitor statistics properties using the same tools that you use for permanent statistics:

  • Löschen Sie temporäre Statistiken mit der Anweisung DROP STATISTICS.Delete temporary statistics using the DROP STATISTICS statement.
  • Überwachen Sie Statistiken mit den Katalogsichten sys.stats und sys.stats_columns.Monitor statistics using the sys.stats and sys.stats_columns catalog views. sys_stats beinhaltet die Spalte is_temporary . Damit wird angegeben, welche Statistiken dauerhaft und welche temporär sind.sys_stats includes the is_temporary column, to indicate which statistics are permanent and which are temporary.

    Da temporäre Statistiken in tempdbgespeichert werden, werden durch einen Neustart des SQL ServerSQL Server -Diensts alle temporären Statistiken entfernt.Because temporary statistics are stored in tempdb, a restart of the SQL ServerSQL Server service causes all temporary statistics to disappear.

Zeitpunkt der StatistikaktualisierungWhen to update statistics

Der Abfrageoptimierer stellt fest, wann Statistiken veraltet sein könnten, und aktualisiert sie, sobald sie für einen Abfrageplan benötigt werden.The Query Optimizer determines when statistics might be out-of-date and then updates them when they are needed for a query plan. In einigen Fällen können Sie den Abfrageplan und damit die Abfrageleistung verbessern, indem Sie Statistiken häufiger aktualisieren, als dies bei Aktivierung von AUTO_UPDATE_STATISTICS der Fall ist.In some cases you can improve the query plan and therefore improve query performance by updating statistics more frequently than occur when AUTO_UPDATE_STATISTICS is on. Sie können Statistiken mit der UPDATE STATISTICS-Anweisung oder der gespeicherten Prozedur sp_updatestats aktualisieren.You can update statistics with the UPDATE STATISTICS statement or the stored procedure sp_updatestats.

Durch das Update von Statistiken wird sichergestellt, dass Abfragen anhand aktueller Statistiken kompiliert werden.Updating statistics ensures that queries compile with up-to-date statistics. Dies führt jedoch dazu, dass Abfragen neu kompiliert werden.However, updating statistics causes queries to recompile. 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.We recommend not updating statistics too frequently because there is a performance tradeoff between improving query plans and the time it takes to recompile queries. Die Entscheidung hängt von der verwendeten Anwendung ab.The specific tradeoffs depend on your application.

Beim Aktualisieren von Statistiken mit UPDATE STATISTICS oder sp_updatestats empfiehlt es sich, AUTO_UPDATE_STATISTICS aktiviert zu lassen, damit der Abfrageoptimierer die Statistiken weiterhin routinemäßig aktualisiert.When updating statistics with UPDATE STATISTICS or sp_updatestats, we recommend keeping AUTO_UPDATE_STATISTICS set to ON so that the Query Optimizer continues to routinely update statistics. Weitere Informationen zum Aktualisieren von Statistiken für eine Spalte, einen Index, eine Tabelle oder eine indizierte Sicht finden Sie unter UPDATE STATISTICS (Transact-SQL).For more information about how to update statistics on a column, an index, a table, or an indexed view, see UPDATE STATISTICS (Transact-SQL). 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 (Transact-SQL).For information about how to update statistics for all user-defined and internal tables in the database, see the stored procedure sp_updatestats (Transact-SQL).

Um zu ermitteln, wann Statistiken zuletzt aktualisiert wurden, verwenden Sie die Funktionen sys.dm_db_stats_properties oder STATS_DATE.To determine when statistics were last updated, use the sys.dm_db_stats_properties or STATS_DATE functions.

Ziehen Sie die Aktualisierung von Statistiken unter folgenden Bedingungen in Betracht:Consider updating statistics for the following conditions:

  • Die Ausführungszeiten von Abfragen sind langsam.Query execution times are slow.
  • Es werden INSERT-Vorgänge für aufsteigend oder absteigend sortierte Schlüsselspalten ausgeführt.Insert operations occur on ascending or descending key columns.
  • Eine Wartung wurde durchgeführt.After maintenance operations.

Lange Ausführungszeiten für AbfragenQuery execution times are slow

Wenn die Antwortzeiten von Abfragen langsam oder nicht vorhersagbar sind, sollten Sie sicherstellen, dass Abfragen auf aktuelle Statistiken zugreifen, bevor Sie weitere Schritte zur Problembehandlung ausführen.If query response times are slow or unpredictable, ensure that queries have up-to-date statistics before performing additional troubleshooting steps.

INSERT-Ausführungen für aufsteigend oder absteigend sortierte SchlüsselspaltenInsert operations occur on ascending or descending key columns

Statistiken für aufsteigend oder absteigend sortierte Schlüsselspalten, z.B. IDENTITY-Spalten oder Spalten mit Echtzeit-Zeitstempeln, können häufigere Statistikaktualisierungen erfordern, als sie vom Abfrageoptimierer ausgeführt werden.Statistics on ascending or descending key columns, such as IDENTITY or real-time timestamp columns, might require more frequent statistics updates than the Query Optimizer performs. Durch INSERT-Vorgänge werden neue Werte an aufsteigend oder absteigend sortierte Spalten angefügt.Insert operations append new values to ascending or descending columns. Möglicherweise wurden zu wenige Zeilen hinzugefügt, um ein Statistikupdate auszulösen.The number of rows added might be too small to trigger a statistics update. Wenn Statistiken nicht aktuell sind und bei der Abfrageausführung aus den zuletzt hinzugefügten Zeilen ausgewählt wird, weisen die aktuellen Statistiken keine Kardinalitätsschätzungen für diese neuen Werte auf.If statistics are not up-to-date and queries select from the most recently added rows, the current statistics will not have cardinality estimates for these new values. Dies kann zu ungenauen Kardinalitätsschätzungen und einer langsamen Abfrageleistung führen.This can result in inaccurate cardinality estimates and slow query performance.

Eine Abfrage, die aus den letzten Bestelldaten auswählt, verfügt z. B. über ungenaue Kardinalitätsschätzungen, wenn die Statistiken nicht aktualisiert werden, um Kardinalitätsschätzungen für die letzten Bestelldaten einzuschließen.For example, a query that selects from the most recent sales order dates will have inaccurate cardinality estimates if the statistics are not updated to include cardinality estimates for the most recent sales order dates.

Nach WartungsvorgängenAfter maintenance operations

Die Aktualisierung von Statistiken empfiehlt sich auch nach dem Durchführen von Wartungsvorgängen, durch die die Verteilung der Daten geändert wird; hierzu gehören z. B. das Abschneiden einer Tabelle oder das Ausführen einer Masseneinfügung für einen großen Prozentsatz von Zeilen.Consider updating statistics after performing maintenance procedures that change the distribution of data, such as truncating a table or performing a bulk insert of a large percentage of the rows. Dadurch lassen sich zukünftige Verzögerungen bei der Abfrageverarbeitung vermeiden, d. h., Abfragen müssen nicht auf automatische Statistikupdates warten.This can avoid future delays in query processing while queries wait for automatic statistics updates.

Vorgänge wie das Neuerstellen, Defragmentieren oder Neuorganisieren eines Indexes wirken sich nicht auf die Verteilung von Daten aus.Operations such as rebuilding, defragmenting, or reorganizing an index do not change the distribution of data. Folglich müssen Sie keine Statistiken aktualisieren, nachdem Sie die Vorgänge ALTER INDEX REBUILD, DBCC DBREINDEX, DBCC INDEXDEFRAG oder ALTER INDEX REORGANIZE ausgeführt haben.Therefore, you do not need to update statistics after performing ALTER INDEX REBUILD, DBCC DBREINDEX, DBCC INDEXDEFRAG, or ALTER INDEX REORGANIZE operations. Der Abfrageoptimierer aktualisiert Statistiken, wenn mit ALTER INDEX REBUILD oder DBCC DBREINDEX ein Index für eine Tabelle oder Sicht erstellt wird. Diese Statistikaktualisierung tritt jedoch als Nebenprodukt der Indexneuerstellung auf.The Query Optimizer updates statistics when you rebuild an index on a table or view with ALTER INDEX REBUILD or DBCC DBREINDEX, however this statistics update is a byproduct of re-creating the index. Der Abfrageoptimierer führt nach einem DBCC INDEXDEFRAG-Vorgang oder ALTER INDEX REORGANIZE-Vorgang keine Statistikaktualisierung durch.The Query Optimizer does not update statistics after DBCC INDEXDEFRAG or ALTER INDEX REORGANIZE operations.

Tipp

Verwenden Sie ab SQL Server 2016SQL Server 2016 SP1 CU4 die PERSIST_SAMPLE_PERCENT-Option von CREATE STATISTICS (Transact-SQL) oder UPDATE STATISTICS (Transact-SQL), um einen bestimmten Prozentsatz für die Stichprobenentnahme für nachfolgende Statistikaktualisierungen festzulegen und beizubehalten, die einen solchen Prozentzsatz nicht explizit angeben.Starting with SQL Server 2016SQL Server 2016 SP1 CU4, use the PERSIST_SAMPLE_PERCENT option of CREATE STATISTICS (Transact-SQL) or UPDATE STATISTICS (Transact-SQL), to set and retain a specific sampling percentage for subsequent statistic updates that do not explicitly specify a sampling percentage.

Abfragen mit effektiver Verwendung von StatistikenQueries that use statistics effectively

Bestimmte Abfrageimplementierungen, z. B. lokale Variablen und komplexe Ausdrücke im Abfrageprädikat, können zu suboptimalen Abfrageplänen führen.Certain query implementations, such as local variables and complex expressions in the query predicate, can lead to suboptimal query plans. Sie können dies verhindern, indem Sie Abfrageentwurfsrichtlinien für die effektive Verwendung von Statistiken befolgen.Following query design guidelines for using statistics effectively can help to avoid this. Weitere Informationen zu Abfrageprädikaten finden Sie unter Suchbedingung (Transact-SQL).For more information about query predicates, see Search Condition (Transact-SQL).

Zur Optimierung von Abfrageplänen können Sie Abfrageentwurfsrichtlinien anwenden, die Statistiken effektiv einsetzen, um Kardinalitätsschätzungen für Ausdrücke, Variablen und Funktionen in Abfrageprädikaten zu verbessern.You can improve query plans by applying query design guidelines that use statistics effectively to improve cardinality estimates for expressions, variables, and functions used in query predicates. Wenn der Abfrageoptimierer den Wert eines Ausdrucks, einer Variablen oder Funktion nicht kennt, weiß er nicht, welchen Wert er im Histogramm suchen soll. Folglich kann nicht die beste Kardinalitätsschätzung aus dem Histogramm abgerufen werden.When the Query Optimizer does not know the value of an expression, variable, or function, it does not know which value to lookup in the histogram and therefore cannot retrieve the best cardinality estimate from the histogram. Für alle als Stichprobe entnommenen Zeilen im Histogramm verwendet der Abfrageoptimierer stattdessen die durchschnittliche Anzahl von Zeilen pro eindeutigem Wert als Basis für die Kardinalitätsschätzung.Instead, the Query Optimizer bases the cardinality estimate on the average number of rows per distinct value for all of the sampled rows in the histogram. Dies führt zu suboptimalen Kardinalitätsschätzungen und kann die Abfrageleistung beeinträchtigen.This leads to suboptimal cardinality estimates and can hurt query performance. Weitere Informationen zu Histogrammen finden Sie im Abschnitt Histogramm auf dieser Seite oder unter sys.dm_db_stats_histogram.For more information about histograms, see histogram section in this page or sys.dm_db_stats_histogram.

In den folgenden Richtlinien wird beschrieben, wie Abfragen geschrieben werden müssen, um Abfragepläne durch optimierte Kardinalitätsschätzungen zu verbessern.The following guidelines describe how to write queries to improve query plans by improving cardinality estimates.

Verbessern der Kardinalitätsschätzung für AusdrückeImproving cardinality estimates for expressions

Um Kardinalitätsschätzungen für Ausdrücke zu verbessern, beachten Sie die folgenden Richtlinien:To improve cardinality estimates for expressions, follow these guidelines:

  • Vereinfachen Sie nach Möglichkeit Ausdrücke, in denen Konstanten enthalten sind.Whenever possible, simplify expressions with constants in them. Der Abfrageoptimierer wertet nicht alle Funktionen und Ausdrücke mit Konstanten aus, bevor er Kardinalitätsschätzungen ermittelt.The Query Optimizer does not evaluate all functions and expressions containing constants prior to determining cardinality estimates. Vereinfachen Sie z.B. den ABS(-100)-Ausdruck in 100.For example, simplify the expression ABS(-100) to 100.

  • Wenn der Ausdruck mehrere Variablen verwendet, können Sie in Betracht ziehen, eine berechnete Spalte für den Ausdruck und dann Statistiken oder einen Index für die berechnete Spalte zu erstellen.If the expression uses multiple variables, consider creating a computed column for the expression and then create statistics or an index on the computed column. Das Abfrageprädikat WHERE PRICE + Tax > 100 könnte beispielsweise eine bessere Kardinalitätsschätzung aufweisen, wenn Sie eine berechnete Spalte für den Ausdruck Price + Taxerstellen.For example, the query predicate WHERE PRICE + Tax > 100 might have a better cardinality estimate if you create a computed column for the expression Price + Tax.

Verbessern der Kardinalitätsschätzung für Variablen und FunktionenImproving cardinality estimates for variables and functions

Um die Kardinalitätsschätzungen für Variablen und Funktionen zu verbessern, beachten Sie die folgenden Richtlinien:To improve the cardinality estimates for variables and functions, follow these guidelines:

  • Wenn das Abfrageprädikat eine lokale Variable verwendet, könnte das Umschreiben der Abfrage sinnvoll sein, sodass sie statt einer lokalen Variablen einen Parameter verwendet.If the query predicate uses a local variable, consider rewriting the query to use a parameter instead of a local variable. Der Wert einer lokalen Variablen ist nicht bekannt, wenn der Abfrageoptimierer den Abfrageausführungsplan erstellt.The value of a local variable is not known when the Query Optimizer creates the query execution plan. Wenn eine Abfrage auf einem Parameter basiert, verwendet der Abfrageoptimierer die Kardinalitätsschätzung für den ersten tatsächlichen Parameterwert, der an die gespeicherte Prozedur übergeben wird.When a query uses a parameter, the Query Optimizer uses the cardinality estimate for the first actual parameter value that is passed to the stored procedure.

  • Erwägen Sie die Verwendung einer Standardtabelle oder temporären Tabelle, in der die Ergebnisse der Tabellenwertfunktionen mit mehreren Anweisungen enthalten sind.Consider using a standard table or temporary table to hold the results of multi-statement table-valued functions (mstvf). Der Abfrageoptimierer erstellt keine Statistiken für Tabellenwertfunktionen mit mehreren Anweisungen.The Query Optimizer does not create statistics for multi-statement table-valued functions. Bei diesem Ansatz kann der Abfrageoptimierer Statistiken für die Tabellenspalten erstellen und sie zum Optimieren der Abfragepläne nutzen.With this approach the Query Optimizer can create statistics on the table columns and use them to create a better query plan.

  • Standardtabellen oder temporäre Tabelle können auch als Ersatz für Tabellenvariablen verwendet werden.Consider using a standard table or temporary table as a replacement for table variables. Der Abfrageoptimierer erstellt keine Statistiken für Tabellenvariablen.The Query Optimizer does not create statistics for table variables. Bei diesem Ansatz kann der Abfrageoptimierer Statistiken für die Tabellenspalten erstellen und sie zum Optimieren der Abfragepläne nutzen.With this approach the Query Optimizer can create statistics on the table columns and use them to create a better query plan. Die Vorteile von temporären Tabellen und Tabellenvariablen müssen gegeneinander abgewogen werden. Tabellenvariablen, die in gespeicherten Prozeduren verwendet werden, verursachen weniger Neukompilierungen der gespeicherten Prozedur als temporäre Tabellen.There are tradeoffs in determining whether to use a temporary table or a table variable; Table variables used in stored procedures cause fewer recompilations of the stored procedure than temporary tables. Nicht bei allen Anwendungen wird die Leistung optimiert, wenn statt einer Tabellenvariablen eine temporäre Tabelle verwendet wird.Depending on the application, using a temporary table instead of a table variable might not improve performance.

  • Wenn eine gespeicherte Prozedur eine Abfrage enthält, die einen übergebenen Parameter verwendet, sollten Sie den Parameterwert innerhalb der gespeicherten Prozedur nicht ändern, bevor Sie ihn in der Abfrage verwenden.If a stored procedure contains a query that uses a passed-in parameter, avoid changing the parameter value within the stored procedure before using it in the query. Die Kardinalitätsschätzungen für die Abfrage basieren auf dem übergebenen Parameterwert und nicht auf dem aktualisierten Wert.The cardinality estimates for the query are based on the passed-in parameter value and not the updated value. Damit der Parameterwert nicht geändert werden kann, können Sie die Abfrage so umschreiben, dass zwei gespeicherte Prozeduren verwendet werden.To avoid changing the parameter value, you can rewrite the query to use two stored procedures.

    Durch die folgende gespeicherte Prozedur Sales.GetRecentSales wird beispielsweise der Wert des Parameters @date geändert, wenn @date auf NULL festgelegt ist.For example, the following stored procedure Sales.GetRecentSales changes the value of the parameter @date when @date is NULL.

    USE AdventureWorks2012;  
    GO  
    IF OBJECT_ID ( 'Sales.GetRecentSales', 'P') IS NOT NULL  
        DROP PROCEDURE Sales.GetRecentSales;  
    GO  
    CREATE PROCEDURE Sales.GetRecentSales (@date datetime)  
    AS BEGIN  
        IF @date IS NULL  
            SET @date = DATEADD(MONTH, -3, (SELECT MAX(ORDERDATE) FROM Sales.SalesOrderHeader))  
        SELECT * FROM Sales.SalesOrderHeader h, Sales.SalesOrderDetail d  
        WHERE h.SalesOrderID = d.SalesOrderID  
        AND h.OrderDate > @date  
    END  
    GO  
    

    Wenn der erste Aufruf der gespeicherten Prozedur Sales.GetRecentSales für den Parameter @date NULL übergibt, kompiliert der Abfrageoptimierer die gespeicherte Prozedur mit der Kardinalitätsschätzung für @date = NULL, obwohl das Abfrageprädikat nicht mit @date = NULLaufgerufen wird.If the first call to the stored procedure Sales.GetRecentSales passes a NULL for the @date parameter, the Query Optimizer will compile the stored procedure with the cardinality estimate for @date = NULL even though the query predicate is not called with @date = NULL. Diese Kardinalitätsschätzung kann deutlich von der Anzahl der Zeilen im tatsächlichen Abfrageergebnis abweichen.This cardinality estimate might be significantly different than the number of rows in the actual query result. Folglich könnte der Abfrageoptimierer einen suboptimalen Abfrageplan auswählen.As a result, the Query Optimizer might choose a suboptimal query plan. Um dies zu vermeiden, können Sie die gespeicherte Prozedur wie folgt in zwei Prozeduren unterteilen:To help avoid this, you can rewrite the stored procedure into two procedures as follows:

    USE AdventureWorks2012;  
    GO  
    IF OBJECT_ID ( 'Sales.GetNullRecentSales', 'P') IS NOT NULL  
        DROP PROCEDURE Sales.GetNullRecentSales;  
    GO  
    CREATE PROCEDURE Sales.GetNullRecentSales (@date datetime)  
    AS BEGIN  
        IF @date is NULL  
            SET @date = DATEADD(MONTH, -3, (SELECT MAX(ORDERDATE) FROM Sales.SalesOrderHeader))  
        EXEC Sales.GetNonNullRecentSales @date;  
    END  
    GO  
    IF OBJECT_ID ( 'Sales.GetNonNullRecentSales', 'P') IS NOT NULL  
        DROP PROCEDURE Sales.GetNonNullRecentSales;  
    GO  
    CREATE PROCEDURE Sales.GetNonNullRecentSales (@date datetime)  
    AS BEGIN  
        SELECT * FROM Sales.SalesOrderHeader h, Sales.SalesOrderDetail d  
        WHERE h.SalesOrderID = d.SalesOrderID  
        AND h.OrderDate > @date  
    END  
    GO  
    

Verbessern der Kardinalitätsschätzung mit AbfragehinweisenImproving cardinality estimates with query hints

Um Kardinalitätsschätzungen für lokale Variablen zu verbessern, können Sie den OPTIMIZE FOR <value>-Abfragehinweis oder den OPTIMIZE FOR UNKNOWN-Abfragehinweis mit RECOMPILE verwenden.To improve cardinality estimates for local variables, you can use the OPTIMIZE FOR <value> or OPTIMIZE FOR UNKNOWN query hints with RECOMPILE. Weitere Informationen finden Sie unter Abfragehinweise (Transact-SQL).For more information, see Query Hints (Transact-SQL).

Bei einigen Anwendungen könnte es zu lange dauern, die Abfrage bei jeder Ausführung neu zu kompilieren.For some applications, recompiling the query each time it executes might take too much time. Der OPTIMIZE FOR-Abfragehinweis kann selbst dann hilfreich sein, wenn Sie die RECOMPILE-Option nicht verwenden.The OPTIMIZE FOR query hint can help even if you don't use the RECOMPILE option. Sie können der gespeicherten Prozedur „Sales.GetRecentSales“ z.B. eine OPTIMIZE FOR-Option hinzufügen, um ein bestimmtes Datum anzugeben.For example, you could add an OPTIMIZE FOR option to the stored procedure Sales.GetRecentSales to specify a specific date. Im folgenden Beispiel wird der Prozedur „Sales.GetRecentSales“ OPTIMIZE FOR-Option hinzugefügt.The following example adds the OPTIMIZE FOR option to the Sales.GetRecentSales procedure.

USE AdventureWorks2012;  
GO  
IF OBJECT_ID ( 'Sales.GetRecentSales', 'P') IS NOT NULL  
    DROP PROCEDURE Sales.GetRecentSales;  
GO  
CREATE PROCEDURE Sales.GetRecentSales (@date datetime)  
AS BEGIN  
    IF @date is NULL  
        SET @date = DATEADD(MONTH, -3, (SELECT MAX(ORDERDATE) FROM Sales.SalesOrderHeader))  
    SELECT * FROM Sales.SalesOrderHeader h, Sales.SalesOrderDetail d  
    WHERE h.SalesOrderID = d.SalesOrderID  
    AND h.OrderDate > @date  
    OPTION ( OPTIMIZE FOR ( @date = '2004-05-01 00:00:00.000'))  
END;  
GO  

Verbessern der Kardinalitätsschätzung mit PlanhinweislistenImproving cardinality estimates with Plan Guides

Für einige Anwendungen sind die Abfrageentwurfsrichtlinien möglicherweise nicht geeignet, weil Sie die Abfrage nicht ändern können oder die Verwendung des RECOMPILE-Abfragehinweises zu viele Neukompilierungen verursacht.For some applications, query design guidelines might not apply because you cannot change the query or using the RECOMPILE query hint might be cause too many recompiles. Sie können mithilfe der Planhinweislisten weitere Hinweise (z. B. USE PLAN) angeben, um das Abfrageverhalten zu steuern. Zur gleichen Zeit können Sie mit dem Hersteller klären, ob die Anwendung geändert wurde.You can use plan guides to specify other hints, such as USE PLAN, to control the behavior of the query while investigating application changes with the application vendor. Weitere Informationen zu Planhinweislisten finden Sie unter Planhinweislisten.For more information about plan guides, see Plan Guides.

Weitere Informationen finden Sie unterSee Also

CREATE STATISTICS (Transact-SQL) CREATE STATISTICS (Transact-SQL)
UPDATE STATISTICS (Transact-SQL) UPDATE STATISTICS (Transact-SQL)
sp_updatestats (Transact-SQL) sp_updatestats (Transact-SQL)
DBCC SHOW_STATISTICS (Transact-SQL) DBCC SHOW_STATISTICS (Transact-SQL)
ALTER DATABASE SET-Optionen (Transact-SQL) ALTER DATABASE SET Options (Transact-SQL)
DROP STATISTICS (Transact-SQL) DROP STATISTICS (Transact-SQL)
CREATE INDEX (Transact-SQL) CREATE INDEX (Transact-SQL)
ALTER INDEX (Transact-SQL) ALTER INDEX (Transact-SQL)
Erstellen gefilterter Indizes Create Filtered Indexes
Steuern des Verhaltens des automatischen Statistikupdates (AUTO_UPDATE_STATISTICS) in SQL Server Controlling Autostat (AUTO_UPDATE_STATISTICS) behavior in SQL Server
STATS_DATE (Transact-SQL) STATS_DATE (Transact-SQL)
sys.dm_db_stats_properties (Transact-SQL) sys.dm_db_stats_properties (Transact-SQL)
sys.dm_db_stats_histogram (Transact-SQL)sys.dm_db_stats_histogram (Transact-SQL)
sys.statssys.stats
sys.stats_columns (Transact-SQL)sys.stats_columns (Transact-SQL)