EstadísticasStatistics

SE APLICA A: síSQL Server síAzure SQL Database síAzure SQL Data Warehouse síAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

El Optimizador de consultas utiliza estadísticas para crear planes de consulta que mejoren el rendimiento de las consultas.The Query Optimizer uses statistics to create query plans that improve query performance. En el caso de la mayoría de las consultas, el Optimizador de consultas genera ya las estadísticas necesarias para un plan de consulta de alta calidad. En algunos casos, para obtener los mejores resultados, es necesario crear estadísticas adicionales o modificar el diseño de la consulta.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. En este tema se explican los conceptos de estadísticas y se proporcionan directrices para usar las estadística de optimización de consultas de forma eficaz.This topic discusses statistics concepts and provides guidelines for using query optimization statistics effectively.

Componentes y conceptosComponents and Concepts

EstadísticasStatistics

Las estadísticas para la optimización de consulta son objetos binarios grandes (BLOB) que contienen información estadística sobre la distribución de valores en una o más columnas de una tabla o vista indizada.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. El Optimizador de consultas utiliza estas estadísticas para estimar la cardinalidad, es decir, el número de filas, en el resultado de la consulta.The Query Optimizer uses these statistics to estimate the cardinality, or number of rows, in the query result. Estas estimaciones de cardinalidad permiten al Optimizador de consultas crear un plan de consulta de alta calidad.These cardinality estimates enable the Query Optimizer to create a high-quality query plan. Por ejemplo, en función de los predicados, el Optimizador de consultas podría usar las estimaciones de cardinalidad para elegir el operador Index Seek en lugar del operador Index Scan, que requiere un uso intensivo de los recursos, si eso mejora el rendimiento de la consulta.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, if doing so improves query performance.

Cada objeto de estadísticas se crea en una lista de una o más columnas de la tabla e incluye un histograma que muestra la distribución de valores en la primera columna.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. Los objetos de estadísticas en varias columnas también almacenan la información estadística relativa a la correlación de valores entre las columnas.Statistics objects on multiple columns also store statistical information about the correlation of values among the columns. Estas estadísticas de la correlación, o densidades, derivan del número de filas distintas de valores de columna.These correlation statistics, or densities, are derived from the number of distinct rows of column values.

HistogramaHistogram

Un histograma mide la frecuencia de aparición de cada valor distinto en un conjunto de datos.A histogram measures the frequency of occurrence for each distinct value in a data set. El optimizador de consultas calcula un histograma de los valores de la primera columna de clave del objeto de estadísticas; para ello, selecciona los valores de la columna tomando una muestra estadística de las filas o realizando un análisis completo de todas las filas de la tabla o vista.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. Si el histograma se crea a partir de muestras de un conjunto de filas, los totales almacenados para el número de filas y el número de valores distintos son las estimaciones y no es necesario que sean números enteros.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.

Nota

Los histogramas de SQL ServerSQL Server solo se crean para una única columna: la primera del conjunto de columnas de clave del objeto de estadísticas.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.

Para crear el histograma, el optimizador de consultas ordena los valores de columna, calcula el número de valores que coinciden con cada valor de columna distinto y, a continuación, agrupa los valores de columna en un máximo de 200 pasos de histograma contiguos.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. Cada paso del histograma incluye un rango de valores de columna seguido de un valor de columna de límite superior.Each histogram step includes a range of column values followed by an upper bound column value. El intervalo incluye todos los valores de columna posibles comprendidos entre los valores límite (sin incluir los propios valores límite).The range includes all possible column values between boundary values, excluding the boundary values themselves. El valor de columna ordenado más pequeño es el valor del límite superior del primer paso del histograma.The lowest of the sorted column values is the upper boundary value for the first histogram step.

Más concretamente, SQL ServerSQL Server crea el histograma del conjunto ordenado de valores de columna en tres pasos:In more detail, SQL ServerSQL Server creates the histogram from the sorted set of column values in three steps:

  • Inicialización del histograma: en el primer paso, se procesa una secuencia de valores desde el principio del conjunto ordenado y se recopila un máximo de 200 valores de range_high_key, equal_rows, range_rows y distinct_range_rows (range_rows y distinct_range_rows son siempre cero durante este paso).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). El primer paso finaliza cuando se han agotado todas las entradas o cuando se han encontrado 200 valores.The first step ends either when all input has been exhausted, or when 200 values have been found.
  • Examen con combinación de depósito: cada valor adicional de la columna inicial de la clave de estadísticas se procesa en el segundo paso, de forma ordenada; cada valor sucesivo se agrega al último rango o se crea un rango al final (esto es posible porque los valores de entrada están ordenados).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). Si se crea un rango nuevo, un par de rangos existentes colindantes se contrae en un solo rango.If a new range is created, then one pair of existing, neighboring ranges is collapsed into a single range. Este par de rangos se selecciona para minimizar la pérdida de información.This pair of ranges is selected in order to minimize information loss. Este método usa un algoritmo de diferencias máximas para minimizar el número de pasos del histograma a la vez que maximiza las diferencias entre los valores de límite.This method uses a maximum difference algorithm to minimize the number of steps in the histogram while maximizing the difference between the boundary values. El número de pasos después de contraer los rangos permanece en 200 a lo largo de este paso.The number of steps after collapsing ranges stays at 200 throughout this step.
  • Consolidación del histograma: en el tercer paso, es posible que se contraigan más rangos si no se pierde una cantidad significativa de información.Histogram consolidation: In the third step, more ranges may be collapsed if a significant amount of information is not lost. El número de pasos del histograma puede ser menor que el número de valores distintos, incluso para las columnas con menos de 200 puntos de límite.The number of histogram steps can be fewer than the number of distinct values, even for columns with fewer than 200 boundary points. Por lo tanto, incluso si la columna tiene más de 200 valores únicos, es posible que el histograma tenga menos de 200 pasos.Therefore, even if the column has more than 200 unique values, the histogram may have less than 200 steps. Para una columna formada solamente por valores únicos, el histograma consolidado tendrá un mínimo de tres pasos.For a column consisting of only unique values, then the consolidated histogram will have a minimum of three steps.

Nota

Si se ha generado el histograma con un ejemplo en lugar de hacerlo mediante fullscan, los valores de equal_rows, range_rows, distinct_range_rows y average_range_rows son estimados y, por tanto, no es necesario que sean números enteros.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.

En el diagrama siguiente se muestra un histograma con seis pasos.The following diagram shows a histogram with six steps. El área a la izquierda del primer valor límite superior es el primer paso.The area to the left of the first upper boundary value is the first step.

En cada paso del histograma anterior:For each histogram step above:

  • La línea gruesa representa el valor de límite superior (range_high_key) y el número de veces que tiene lugar (equal_rows).Bold line represents the upper boundary value (range_high_key) and the number of times it occurs (equal_rows)

  • El área de color sólido situada a la izquierda de range_high_key representa el rango de valores de columna y el número medio de veces que tiene lugar cada valor de columna (average_range_rows).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). El valor de average_range_rows en el primer paso del histograma siempre es 0.The average_range_rows for the first histogram step is always 0.

  • Las líneas de puntos representan los valores de las muestras utilizados para estimar el número total de valores distintos que hay en el rango (distinct_range_rows) y el número total de valores que hay en el rango (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). El optimizador de consultas utiliza range_rows y distinct_range_rows para calcular average_range_rows y no almacena los valores de las muestras.The query optimizer uses range_rows and distinct_range_rows to compute average_range_rows and does not store the sampled values.

Vector de densidadDensity Vector

Densidad es la información sobre el número de duplicados en una determinada columna o combinación de columnas, y se calcula como 1/(número de valores distintos).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). El optimizador de consultas utiliza las densidades para mejorar las estimaciones de cardinalidad de las consultas que devuelven varias columnas de la misma tabla o vista indizada.The query optimizer uses densities to enhance cardinality estimates for queries that return multiple columns from the same table or indexed view. A medida que disminuye la densidad, aumenta la selectividad de un valor.As density decreases, selectivity of a value increases. Por ejemplo, en una tabla que representa automóviles, muchos automóviles tienen el mismo fabricante, pero cada uno dispone de un único número de identificación de vehículo (NIV).For example, in a table representing cars, many cars have the same manufacturer, but each car has a unique vehicle identification number (VIN). Un índice del NIV es más selectivo que un índice del fabricante, porque NIV tiene una densidad inferior a la del fabricante.An index on the VIN is more selective than an index on the manufacturer, because VIN has lower density than manufacturer.

Nota

Frecuencia es la información sobre la aparición de cada valor distinto en la primera columna de clave del objeto de estadísticas y se calcula como el recuento de filas * densidad.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. Puede encontrarse una frecuencia máxima de 1 en las columnas con valores únicos.A maximum frequency of 1 can be found in columns with unique values.

El vector de densidad contiene una densidad para cada prefijo de columnas del objeto de estadísticas.The density vector contains one density for each prefix of columns in the statistics object. Por ejemplo, si un objeto de estadísticas tiene las columnas de clave CustomerId, ItemId y Price, la densidad se calcula en cada uno de los siguientes prefijos de columna.For example, if a statistics object has the key columns CustomerId, ItemId and Price, density is calculated on each of the following column prefixes.

Prefijo de columnaColumn prefix Densidad calculada enDensity calculated on
(IdCliente)(CustomerId) Filas con valores que se corresponden con IdClienteRows with matching values for CustomerId
(IdCliente, IdArtículo)(CustomerId, ItemId) Filas con valores que se corresponden con IdCliente e IdArtículoRows with matching values for CustomerId and ItemId
(IdCliente, IdArtículo, Precio)(CustomerId, ItemId, Price) Filas con valores que se corresponden con IdCliente, IdArtículo y PrecioRows with matching values for CustomerId, ItemId, and Price

Estadísticas filtradasFiltered Statistics

Las estadísticas filtradas pueden mejorar el rendimiento de las consultas que se seleccionan desde subconjuntos de datos bien definidos.Filtered statistics can improve query performance for queries that select from well-defined subsets of data. Las estadísticas filtradas utilizan un predicado de filtro para seleccionar el subconjunto de datos que se incluye en las estadísticas.Filtered statistics use a filter predicate to select the subset of data that is included in the statistics. Las estadísticas filtradas bien diseñadas pueden mejorar el plan de ejecución de la consulta en comparación con las estadísticas de tabla completa.Well-designed filtered statistics can improve the query execution plan compared with full-table statistics. Para obtener más información sobre el predicado de filtro, vea CREATE STATISTICS (Transact-SQL).For more information about the filter predicate, see CREATE STATISTICS (Transact-SQL). Para obtener más información acerca de cuándo crear las estadísticas filtradas, vea la sección Cuándo crear las estadísticas en este tema.For more information about when to create filtered statistics, see the When to Create Statistics section in this topic.

Opciones de estadísticasStatistics Options

Hay tres opciones que puede establecer que afectan al momento y al modo en que se crean y actualizan las estadísticas.There are three options that you can set that affect when and how statistics are created and updated. Estas opciones se establecen únicamente en el nivel de base de datos.These options are set at the database level only.

Opción AUTO_CREATE_STATISTICSAUTO_CREATE_STATISTICS Option

Cuando está activada la opción automática de creación de estadísticas, AUTO_CREATE_STATISTICS, el optimizador de consultas crea las estadísticas en columnas individuales en el predicado de consulta, según sea necesario, para mejorar las estimaciones de cardinalidad para el plan de consulta.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. Estas estadísticas de columna única se crean en las columnas que aún no tienen un histograma en un objeto de estadísticas existente.These single-column statistics are created on columns that do not already have a histogram in an existing statistics object. La opción AUTO_CREATE_STATISTICS no determina si las estadísticas se crean para los índices.The AUTO_CREATE_STATISTICS option does not determine whether statistics get created for indexes. Esta opción tampoco genera estadísticas filtradas.This option also does not generate filtered statistics. Se aplica estrictamente a estadísticas de columna única para la tabla completa.It applies strictly to single-column statistics for the full table.

Cuando el Optimizador de consultas crea las estadísticas como resultado de usar la opción AUTO_CREATE_STATISTICS, el nombre de las estadísticas comienza con _WA.When the Query Optimizer creates statistics as a result of using the AUTO_CREATE_STATISTICS option, the statistics name starts with _WA. Puede utilizar la consulta siguiente para determinar si el Optimizador de consultas ha creado estadísticas para una columna de predicado de consulta.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;  

Opción AUTO_UPDATE_STATISTICSAUTO_UPDATE_STATISTICS Option

Cuando está activada la opción automática de actualización de estadísticas, AUTO_UPDATE_STATISTICS, el optimizador de consultas determina cuándo las estadísticas pueden quedar obsoletas y las actualiza cuando una consulta las usa.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. Las estadísticas se vuelven obsoletas después de que operaciones de inserción, actualización, eliminación o combinación cambien la distribución de los datos en la tabla o la vista indizada.Statistics become out-of-date after insert, update, delete, or merge operations change the data distribution in the table or indexed view. El Optimizador de consultas determina cuándo las estadísticas pueden quedar obsoletas contando el número de modificaciones de datos desde la actualización más reciente de las estadísticas, comparando el número de modificaciones con respecto a un umbral.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. El umbral se basa en el número de filas de la tabla o la vista indizada.The threshold is based on the number of rows in the table or indexed view.

  • Hasta SQL Server 2014 (12.x)SQL Server 2014 (12.x), SQL ServerSQL Server usa un umbral basado en el porcentaje de filas modificadas.Up to SQL Server 2014 (12.x)SQL Server 2014 (12.x), SQL ServerSQL Server uses a threshold based on the percent of rows changed. Esto es así independientemente del número de filas de la tabla.This is regardless of the number of rows in the table. El umbral es el siguiente:The threshold is:

    • Si la cardinalidad de tabla era de 500 o menos en el momento de la evaluación de las estadísticas, se actualizará cada 500 modificaciones.If the table cardinality was 500 or less at the time statistics were evaluated, update for every 500 modifications.
    • Si la cardinalidad de tabla estaba por encima de 500 en el momento de la evaluación de las estadísticas, se actualizará cada 500 modificaciones, más el 20 % pertinente.If the table cardinality was above 500 at the time statistics were evaluated, update for every 500 + 20 percent of modifications.
  • A partir de SQL Server 2016 (13.x)SQL Server 2016 (13.x) y en el nivel de compatibilidad de base de datos 130, SQL ServerSQL Server usa un umbral de actualización de estadísticas dinámico y decreciente que se ajusta según el número de filas de la tabla.Starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x) 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. Esto se calcula como la raíz cuadrada de 1000 multiplicado por la cardinalidad de tabla actual.This is calculated as the square root of the product of 1000 and the current table cardinality. Por ejemplo, si la tabla contiene 2 millones de filas, entonces, el cálculo es? sqrt (1000 * 2000000) = 44 721,359.For example if your table contains 2 million rows, then the calculation is? sqrt (1000 * 2000000) = 44721.359. Con este cambio, las estadísticas en tablas de gran tamaño se actualizarán con más frecuencia.With this change, statistics on large tables will be updated more often. Sin embargo, si una base de datos tiene un nivel de compatibilidad inferior a 130, se aplicará el umbral de SQL Server 2014 (12.x)SQL Server 2014 (12.x).However, if a database has a compatibility level below 130, then the SQL Server 2014 (12.x)SQL Server 2014 (12.x) threshold applies. ??

Importante

A partir de SQL Server 2008 R2SQL Server 2008 R2 a través de SQL Server 2014 (12.x)SQL Server 2014 (12.x), o bien en SQL Server 2016 (13.x)SQL Server 2016 (13.x) a través de SQL Server 2017SQL Server 2017 en el nivel de compatibilidad de base de datos inferior a 130, use la marca de seguimiento 2371 y SQL ServerSQL Server usará un umbral de actualización de estadísticas dinámico y decreciente que se ajusta según el número de filas de la tabla.Starting with SQL Server 2008 R2SQL Server 2008 R2 through SQL Server 2014 (12.x)SQL Server 2014 (12.x), or in SQL Server 2016 (13.x)SQL Server 2016 (13.x) 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.

El Optimizador de consultas comprueba que hay estadísticas obsoletas antes de compilar una consulta y antes de ejecutar un plan de consulta almacenado en la memoria caché.The Query Optimizer checks for out-of-date statistics before compiling a query and before executing a cached query plan. Antes de compilar una consulta, el Optimizador de consultas utiliza las columnas, tablas y vistas indexadas en el predicado de consulta para determinar qué estadísticas podrían estar obsoletas.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. Antes de ejecutar un plan de consulta almacenado en la memoria caché, Motor de base de datosDatabase Engine comprueba que el plan de consulta hace referencia a las estadísticas actualizadas.Before executing a cached query plan, the Motor de base de datosDatabase Engine verifies that the query plan references up-to-date statistics.

La opción AUTO_UPDATE_STATISTICS se aplica a los objetos de estadísticas creados para los índices, columnas únicas de predicados de consulta y las estadísticas creadas con la instrucción CREATE STATISTICS .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. Esta opción también se aplica a las estadísticas filtradas.This option also applies to filtered statistics.

Para obtener más información sobre el control de AUTO_UPDATE_STATISTICS, consulte Controlar el comportamiento de Autostat (AUTO_UPDATE_STATISTICS) en 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

La opción de actualización asincrónica de estadísticas AUTO_UPDATE_STATISTICS_ASYNC determina si el optimizador de consultas usa actualizaciones sincrónicas o asincrónicas de las estadísticas.The asynchronous statistics update option, AUTO_UPDATE_STATISTICS_ASYNC, determines whether the Query Optimizer uses synchronous or asynchronous statistics updates. La opción de actualización asincrónica de las estadísticas está desactivada de forma predeterminada y el optimizador de consultas actualiza las estadísticas sincrónicamente.By default, the asynchronous statistics update option is OFF, and the Query Optimizer updates statistics synchronously. La opción AUTO_UPDATE_STATISTICS_ASYNC se aplica a los objetos de estadísticas creados para índices y columnas únicas de los predicados de consulta, así como a las estadísticas creadas con la instrucción CREATE STATISTICS .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.

Nota

Para establecer la opción de actualización asincrónica de las estadísticas en SQL Server Management StudioSQL Server Management Studio, en la página Opciones de la ventana Propiedades de la base de datos, las opciones Actualizar estadísticas automáticamente y Actualizar estadísticas automática y asincrónicamente deben establecerse en True.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.

Las actualizaciones de las estadísticas pueden ser sincrónicas (el valor predeterminado) o asincrónicas.Statistics updates can be either synchronous (the default) or asynchronous. Con las actualizaciones sincrónicas de las estadísticas, las consultas siempre se compilan y ejecutan con estadísticas actualizadas. Cuando las estadísticas son obsoletas, el Optimizador de consultas espera a que las estadísticas estén actualizadas antes de compilar y ejecutar la consulta.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. Con las actualizaciones asincrónicas de las estadísticas, las consultas se compilan con las estadísticas existentes incluso aunque no estén actualizadas. El Optimizador de consultas podría elegir un plan de consulta poco óptimo si las estadísticas son obsoletas al compilar la consulta.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. Las consultas que se compilan cuando las actualizaciones asincrónicas han finalizado se beneficiarán del uso de estadísticas actualizadas.Queries that compile after the asynchronous updates have completed will benefit from using the updated statistics.

Considere la posibilidad de usar las estadísticas sincrónicas al realizar las operaciones que cambian la distribución de los datos, como truncar una tabla o realizar una actualización masiva de un gran porcentaje de las filas.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. Si no actualiza las estadísticas después de finalizar la operación, el uso de estadísticas sincrónicas garantizará que las estadísticas estén actualizadas antes de ejecutar las consultas en los datos cambiados.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.

Considere el uso de estadísticas asincrónicas para lograr tiempos de respuesta a la consulta más predecibles en los escenarios siguientes:Consider using asynchronous statistics to achieve more predictable query response times for the following scenarios:

  • Su aplicación ejecuta frecuentemente la misma consulta, consultas similares o los planes de consulta almacenados en memoria caché similares.Your application frequently executes the same query, similar queries, or similar cached query plans. Sus tiempos de respuesta a la consulta podrían ser más predecibles con actualizaciones asincrónicas de las estadísticas que con actualizaciones sincrónicas, porque el Optimizador de consultas puede ejecutar las consultas de entrada sin esperar a que las estadísticas se actualicen.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. Esto evita que se retrasen algunas consultas, pero no otras.This avoids delaying some queries and not others.

  • Su aplicación ha experimentado tiempos de espera de solicitud de cliente causados por una o varias consultas que aguardaban la actualización de estadísticas.Your application has experienced client request time outs caused by one or more queries waiting for updated statistics. En algunos casos, la espera por las estadísticas sincrónicas podría causar errores en aplicaciones con tiempos de espera agresivos.In some cases, waiting for synchronous statistics could cause applications with aggressive time outs to fail.

INCREMENTALINCREMENTAL

Cuando la opción INCREMENTAL de CREATE STATISTICS está establecida en ON, se generan estadísticas por partición.When INCREMENTAL option of CREATE STATISTICS is ON, the statistics created are per partition statistics. Cuando se establece en OFF, se quita el árbol de estadísticas y SQL ServerSQL Server recalcula las estadísticas.When OFF, the statistics tree is dropped and SQL ServerSQL Server re-computes the statistics. El valor predeterminado es OFF.The default is OFF. Este valor invalida la propiedad INCREMENTAL de la base de datos.This setting overrides the database level INCREMENTAL property. Para obtener más información sobre cómo crear estadísticas incrementales, vea CREATE STATISTICS (Transact-SQL).For more information about creating incremental statistics, see CREATE STATISTICS (Transact-SQL). Para obtener más información sobre cómo crear estadísticas por partición automáticamente, vea Propiedades de la base de datos (Página Opciones) y ALTER DATABASE SET Options (Transact-SQL) (Opciones de 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).

Cuando se agregan particiones a una tabla grande, las estadísticas deben actualizarse para que incluyan las particiones nuevas.When new partitions are added to a large table, statistics should be updated to include the new partitions. Sin embargo, el tiempo necesario para examinar la tabla completa (opción FULLSCAN o SAMPLE) puede ser bastante largo.However the time required to scan the entire table (FULLSCAN or SAMPLE option) might be quite long. Además, no es necesario examinar toda la tabla porque puede que solo se necesiten las estadísticas de las particiones nuevas.Also, scanning the entire table isn't necessary because only the statistics on the new partitions might be needed. La opción incremental crea y almacena estadísticas sobre cada partición y, cuando se actualiza, solo actualiza las estadísticas de las particiones que necesitan estadísticas nuevas.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

Si no se admiten las estadísticas por partición, la opción se omite y se genera una advertencia.If per partition statistics are not supported the option is ignored and a warning is generated. Las estadísticas incrementales no se admiten para los siguientes tipos de estadísticas:Incremental stats are not supported for following statistics types:

  • Estadísticas creadas con índices que no están alineados por partición con la tabla base.Statistics created with indexes that are not partition-aligned with the base table.
  • Estadísticas creadas sobre bases de datos secundarias legibles AlwaysOn.Statistics created on Always On readable secondary databases.
  • Estadísticas creadas sobre bases de datos de solo lectura.Statistics created on read-only databases.
  • Estadísticas creadas sobre índices filtrados.Statistics created on filtered indexes.
  • Estadísticas creadas sobre vistas.Statistics created on views.
  • Estadísticas creadas sobre tablas internas.Statistics created on internal tables.
  • Estadísticas creadas con índices espaciales o índices XML.Statistics created with spatial indexes or XML indexes.

Se aplica a: desde SQL Server 2014 (12.x)SQL Server 2014 (12.x) hasta SQL Server 2017SQL Server 2017.Applies to: SQL Server 2014 (12.x)SQL Server 2014 (12.x) through SQL Server 2017SQL Server 2017.

Cuándo crear las estadísticasWhen to create statistics

El Optimizador de consultas ya permite crear las estadísticas de las siguientes formas:The Query Optimizer already creates statistics in the following ways:

  1. El Optimizador de consultas crea las estadísticas para índices en tablas o vistas cuando se crea el índice.The Query Optimizer creates statistics for indexes on tables or views when the index is created. Estas estadísticas se crean en las columnas de clave del índice.These statistics are created on the key columns of the index. Si el índice es un índice filtrado, el Optimizador de consultas crea las estadísticas filtradas en el mismo subconjunto de filas especificado para el índice filtrado.If the index is a filtered index, the Query Optimizer creates filtered statistics on the same subset of rows specified for the filtered index. Para obtener más información sobre los índices filtrados, vea Crear índices filtrados y CREATE INDEX (Transact-SQL).For more information about filtered indexes, see Create Filtered Indexes and CREATE INDEX (Transact-SQL).

  2. El optimizador de consultas crea las estadísticas para las columnas únicas de predicados de consulta cuando AUTO_CREATE_STATISTICS está activada.The Query Optimizer creates statistics for single columns in query predicates when AUTO_CREATE_STATISTICS is on.

Le escuchamos: Si encuentra algo obsoleto o incorrecto en este artículo, como un paso o un ejemplo de código, indíquenoslo.We are listening: If you find something outdated or incorrect in this article, such as a step or a code example, please tell us. Puede hacer clic en el botón Esta página situado en la sección Comentarios en la parte inferior de esta página.You can click the This page button in the Feedback section at the bottom of this page. Leemos todos los elementos de comentarios sobre SQL, normalmente el día siguiente.We read every item of feedback about SQL, typically the next day. Gracias.Thanks.

En la mayoría de las consultas, estos dos métodos de creación de estadísticas aseguran un plan de consulta de alta calidad; en unos casos, puede mejorar los planes de consulta creando estadísticas adicionales con la instrucción CREATE STATISTICS .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. Estas estadísticas adicionales pueden capturar correlaciones estadísticas que el Optimizador de consultas no tiene en cuenta cuando crea estadísticas para índices o columnas únicas.These additional statistics can capture statistical correlations that the Query Optimizer does not account for when it creates statistics for indexes or single columns. Su aplicación podría tener las correlaciones estadísticas adicionales en los datos de la tabla que, si se calcula en un objeto de estadísticas, podrían habilitar el Optimizador de consultas para mejorar los planes de consulta.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. Por ejemplo, las estadísticas filtradas en un subconjunto de filas de datos o las estadísticas de varias columnas en columnas de predicado de consulta podrían mejorar el plan de consulta.For example, filtered statistics on a subset of data rows or multicolumn statistics on query predicate columns might improve the query plan.

Al crear las estadísticas con la instrucción CREATE STATISTICS, recomendamos mantener la opción AUTO_CREATE_STATISTICS para que el Optimizador de consultas continúe creando rutinariamente estadísticas de columna única para las columnas de predicado de consulta.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. Para obtener más información sobre los predicados de consulta, vea Condición de búsqueda (Transact-SQL).For more information about query predicates, see Search Condition (Transact-SQL).

Considere la creación de estadísticas con la instrucción CREATE STATISTICS cuando se aplique cualquiera de los escenarios siguientes:Consider creating statistics with the CREATE STATISTICS statement when any of the following applies:

  • El Asistente para la optimización de Motor de base de datosDatabase Engine sugiere crear las estadísticas.The Motor de base de datosDatabase Engine Tuning Advisor suggests creating statistics.
  • El predicado de consulta contiene varias columnas correlacionadas que ya no están en el mismo índice.The query predicate contains multiple correlated columns that are not already in the same index.
  • La consulta realiza la selección entre un subconjunto de datos.The query selects from a subset of data.
  • La consulta ha perdido estadísticas.The query has missing statistics.

Predicado de consulta con varias columnas correlacionadasQuery Predicate contains multiple correlated columns

Cuando un predicado de consulta contiene varias columnas que tienen relaciones y dependencias entre columnas, las estadísticas sobre esas columnas podrían mejorar el plan de consulta.When a query predicate contains multiple columns that have cross-column relationships and dependencies, statistics on the multiple columns might improve the query plan. Las estadísticas sobre varias columnas contienen estadísticas de correlación entre columnas, llamadas densidades, que no están disponibles en las estadísticas de columna única.Statistics on multiple columns contain cross-column correlation statistics, called densities, that are not available in single-column statistics. Las densidades pueden mejorar las estimaciones de cardinalidad cuando los resultados de la consulta dependen de relaciones de los datos entre varias columnas.Densities can improve cardinality estimates when query results depend on data relationships among multiple columns.

Si las columnas ya están en el mismo índice, el objeto de estadísticas de varias columnas ya existe y no es necesario crearlo manualmente.If the columns are already in the same index, the multicolumn statistics object already exists and it is not necessary to create it manually. Si las columnas no están ya en el mismo índice, puede crear las estadísticas de varias columnas creando un índice en las columnas o usando la instrucción CREATE STATISTICS.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. Se necesitan más recursos del sistema para mantener un índice que para mantener un objeto de estadísticas.It requires more system resources to maintain an index than a statistics object. Si la aplicación no requiere el índice de varias columnas, puede economizar en recursos del sistema creando el objeto de estadísticas sin crear el índice.If the application does not require the multicolumn index, you can economize on system resources by creating the statistics object without creating the index.

Al crear las estadísticas de varias columnas, el orden de las columnas en la definición del objeto de estadísticas afecta a la efectividad de las densidades para realizar las estimaciones de cardinalidad.When creating multicolumn statistics, the order of the columns in the statistics object definition affects the effectiveness of densities for making cardinality estimates. El objeto de estadísticas almacena las densidades correspondientes a cada prefijo de las columnas de clave en la definición del objeto de estadísticas.The statistics object stores densities for each prefix of key columns in the statistics object definition. Para más información sobre las densidades, vea la sección Densidad en esta página.For more information about densities, see Density section in this page.

Para crear densidades que sean útiles para las estimaciones de cardinalidad, las columnas del predicado de consulta deben coincidir con uno de los prefijos de columnas de la definición del objeto de estadísticas.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. Por ejemplo, lo siguiente crea un objeto de estadísticas de varias columnas en las columnas LastName, MiddleNamey FirstName.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  

En este ejemplo, el objeto de estadísticas LastFirst tiene densidades para los siguientes prefijos de columna: (LastName), (LastName, MiddleName) y (LastName, MiddleName, FirstName).In this example, the statistics object LastFirst has densities for the following column prefixes: (LastName), (LastName, MiddleName), and (LastName, MiddleName, FirstName). La densidad no está disponible para (LastName, FirstName).The density is not available for (LastName, FirstName). Si la consulta utiliza LastName y FirstName sin utilizar MiddleName, la densidad no está disponible para las estimaciones de cardinalidad.If the query uses LastName and FirstName without using MiddleName, the density is not available for cardinality estimates.

La consulta realiza la selección entre un subconjunto de datosQuery Selects from a subset of data

Cuando el Optimizador de consultas crea las estadísticas para las columnas únicas e índices, crea las estadísticas para los valores de todas las filas.When the Query Optimizer creates statistics for single columns and indexes, it creates the statistics for the values in all rows. Cuando las consultas realizan la selección de entre un subconjunto de filas, y ese subconjunto de filas tiene una distribución de datos única, las estadísticas filtradas pueden mejorar los planes de consulta.When queries select from a subset of rows, and that subset of rows has a unique data distribution, filtered statistics can improve query plans. Puede crear estadísticas filtradas usando la instrucción CREATE STATISTICS con la cláusula WHERE para definir la expresión del predicado de filtro.You can create filtered statistics by using the CREATE STATISTICS statement with the WHERE clause to define the filter predicate expression.

Por ejemplo, con AdventureWorks2012AdventureWorks2012, cada producto de la tabla Production.Product pertenece a una de las cuatro categorías de la tabla Production.ProductCategory: Bikes, Components, Clothing y Accessories.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. Cada una de las categorías tiene una distribución de datos diferente en función del peso: el peso de las bicicletas (bikes) va de 13,77 a 30,0, el de los componentes (components) de 2,12 a 1050,00 con algunos valores NULL, todos los pesos de la ropa (clothing) son NULL, lo mismo que los de los accesorios (accessories).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.

Utilizando las bicicletas (Bikes) como ejemplo, las estadísticas filtradas para todos los pesos de las bicicletas proporcionarán estadísticas más precisas al Optimizador de consultas y podrán mejorar la calidad del plan de consulta en comparación con las estadísticas de tabla completa o las estadísticas no existentes en la columna del peso (Weight).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. La columna de peso de bicicleta es una buena candidata para las estadísticas filtradas, pero no necesariamente para un índice filtrado si el número de búsquedas de peso es relativamente pequeño.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. La ganancia de rendimiento para las búsquedas que proporciona un índice filtrado no podría ser mayor que el mantenimiento adicional y el costo de almacenamiento de agregar un índice filtrado a la base de datos.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.

La instrucción siguiente crea las estadísticas filtradas BikeWeights en todas las subcategorías de Bikes.The following statement creates the BikeWeights filtered statistics on all of the subcategories for Bikes. La expresión de predicado filtrado define las bicicletas enumerando todas las subcategorías de bicicleta con la comparación Production.ProductSubcategoryID IN (1,2,3).The filtered predicate expression defines bikes by enumerating all of the bike subcategories with the comparison Production.ProductSubcategoryID IN (1,2,3). El predicado no puede utilizar el nombre de categoría Bikes porque está almacenado en la tabla Production.ProductCategory, mientras que todas las columnas de la expresión del filtro deben estar en la misma tabla.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

El Optimizador de consultas puede utilizar estadísticas filtradas de BikeWeights para mejorar el plan de consulta correspondiente a la consulta siguiente. Esta segunda selecciona todas las bicicletas cuyo peso es superior a 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  

Consulta que identifica las estadísticas que faltanQuery identifies missing statistics

Si un error u otro evento evitan que el Optimizador de consultas cree las estadísticas, el Optimizador de consultas creará el plan de consulta sin utilizar las estadísticas.If an error or other event prevents the Query Optimizer from creating statistics, the Query Optimizer creates the query plan without using statistics. El Optimizador de consultas marca las estadísticas como perdidas e intenta regenerar las estadísticas la siguiente vez que se ejecuta la consulta.The Query Optimizer marks the statistics as missing and attempts to regenerate the statistics the next time the query is executed.

Las estadísticas perdidas se indican mediante advertencias (el nombre de la tabla aparece en rojo) cuando el plan de ejecución de una consulta se representa gráficamente mediante SQL Server Management StudioSQL Server Management Studio.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. Además, la supervisión de la clase de eventos Missing Column Statistics con SQL Server ProfilerSQL Server Profiler indica cuándo se han perdido las estadísticas.Additionally, monitoring the Missing Column Statistics event class by using SQL Server ProfilerSQL Server Profiler indicates when statistics are missing. Para obtener más información, vea Errores y advertencias (categoría de eventos del motor de base de datos).For more information, see Errors and Warnings Event Category (Database Engine).

Si se han perdido estadísticas, siga estos pasos:If statistics are missing, perform the following steps:

Cuando faltan las estadísticas de una base de datos de solo lectura o de una instantánea de solo lectura o son obsoletas, Motor de base de datosDatabase Engine crea y mantiene estadísticas temporales en tempdb.When statistics on a read-only database or read-only snapshot are missing or stale, the Motor de base de datosDatabase Engine creates and maintains temporary statistics in tempdb. Cuando Motor de base de datosDatabase Engine crea estadísticas temporales, el nombre de las estadísticas se anexan con el sufijo _readonly_database_statistic para diferenciar las estadísticas temporales de las permanentes.When the Motor de base de datosDatabase Engine creates temporary statistics, the statistics name is appended with the suffix _readonly_database_statistic to differentiate the temporary statistics from the permanent statistics. El sufijo _readonly_database_statistic está reservado para las estadísticas que genera SQL ServerSQL Server.The suffix _readonly_database_statistic is reserved for statistics generated by SQL ServerSQL Server. Los scripts para las estadísticas temporales se pueden crear y reproducir en una base de datos de lectura-escritura.Scripts for the temporary statistics can be created and reproduced on a read-write database. Cuando se crea el script, Management StudioManagement Studio cambia el sufijo del nombre de las estadísticas de _readonly_database_statistic a _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.

Solo SQL ServerSQL Server puede crear y actualizar las estadísticas temporales.Only SQL ServerSQL Server can create and update temporary statistics. No obstante, puede eliminar las estadísticas temporales y supervisar las propiedades de estadísticas mediante las mismas herramientas que se usan para las estadísticas permanentes:However, you can delete temporary statistics and monitor statistics properties using the same tools that you use for permanent statistics:

  • Elimine las estadísticas temporales con la instrucción DROP STATISTICS.Delete temporary statistics using the DROP STATISTICS statement.
  • Supervise las estadísticas con las vistas de catálogo sys.stats y sys.stats_columns .Monitor statistics using the sys.stats and sys.stats_columns catalog views. sys_stats incluye la columna is_temporary para indicar las estadísticas que son permanentes y las que son temporales.sys_stats includes the is_temporary column, to indicate which statistics are permanent and which are temporary.

Debido a que las estadísticas temporales se almacenan en tempdb, el reinicio del servicio SQL ServerSQL Server provoca que desaparezcan todas las estadísticas temporales.Because temporary statistics are stored in tempdb, a restart of the SQL ServerSQL Server service causes all temporary statistics to disappear.

Cuándo actualizar las estadísticasWhen to update statistics

El Optimizador de consultas determina cuándo las estadísticas podrían quedar obsoletas y, a continuación, las actualiza cuando es necesario para un plan de consulta.The Query Optimizer determines when statistics might be out-of-date and then updates them when they are needed for a query plan. En algunos casos puede mejorar el plan de consulta y, por consiguiente, mejorar el rendimiento de la consulta, actualizando las estadísticas con más frecuencia que la que se produce cuando está activada AUTO_UPDATE_STATISTICS.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. Puede actualizar las estadísticas con la instrucción UPDATE STATISTICS o con el procedimiento almacenado sp_updatestats.You can update statistics with the UPDATE STATISTICS statement or the stored procedure sp_updatestats.

La actualización de las estadísticas asegura que las consultas se compilan con estadísticas actualizadas.Updating statistics ensures that queries compile with up-to-date statistics. Sin embargo, la actualización de las estadísticas hace que las consultas se vuelvan a compilar.However, updating statistics causes queries to recompile. Recomendamos no actualizar las estadísticas con demasiada frecuencia, porque hay que elegir el punto válido entre la mejora de los planes de consulta y el tiempo empleado en volver a compilar las consultas.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. Las compensaciones específicas dependen de su aplicación.The specific tradeoffs depend on your application.

Al actualizar las estadísticas con UPDATE STATISTICS o con sp_updatestats, recomendamos mantener la opción AUTO_UPDATE_STATISTICS activada para que el Optimizador de consultas continúe actualizando rutinariamente las estadísticas.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. Para obtener más información sobre cómo actualizar las estadísticas en una columna, un índice, una tabla o una vista indexada, vea 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). Para obtener más información sobre cómo actualizar las estadísticas para todas las tablas internas y definidas por el usuario de la base de datos, vea el procedimiento almacenado 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).

Para determinar cuándo se actualizaron por última vez las estadísticas, use las funciones sys.dm_db_stats_properties o STATS_DATE.To determine when statistics were last updated, use the sys.dm_db_stats_properties or STATS_DATE functions.

Considere la actualización de las estadísticas en las condiciones siguientes:Consider updating statistics for the following conditions:

  • Los tiempos de ejecución de la consulta son lentos.Query execution times are slow.
  • Se producen operaciones de inserción en columnas de clave ascendentes o descendentes.Insert operations occur on ascending or descending key columns.
  • Después de las operaciones de mantenimiento.After maintenance operations.

Tiempos de ejecución de las consultas lentosQuery execution times are slow

Si los tiempos de respuesta de la consulta son lentos o impredecibles, asegúrese de que las consultas tienen estadísticas actualizadas antes de realizar los pasos adicionales de la solución de problemas.If query response times are slow or unpredictable, ensure that queries have up-to-date statistics before performing additional troubleshooting steps.

Operaciones de inserción en columnas de clave ascendentes o descendentesInsert operations occur on ascending or descending key columns

Las estadísticas de columnas de clave ascendentes o descendentes, como IDENTITY o las columnas de marca de tiempo en tiempo real, podrían requerir actualizaciones de las estadísticas más frecuentes que las que realiza el Optimizador de consultas.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. Las operaciones de inserción anexan nuevos valores a las columnas ascendentes o descendentes.Insert operations append new values to ascending or descending columns. El número de filas agregado podría ser demasiado pequeño para desencadenar una actualización de las estadísticas.The number of rows added might be too small to trigger a statistics update. Si las estadísticas no están actualizadas y las consultas se seleccionan de las filas recientemente agregadas, las estadísticas actuales no tendrán estimaciones de cardinalidad para estos nuevos valores.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. Esto puede producir estimaciones de cardinalidad inexactas y un rendimiento lento de las consultas.This can result in inaccurate cardinality estimates and slow query performance.

Por ejemplo, una consulta que selecciona entre las fechas de pedidos de venta más recientes tendrá estimaciones de cardinalidad inexactas si las estadísticas no se han actualizado para incluir las estimaciones de cardinalidad correspondientes a las fechas de pedidos de venta más recientes.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.

Después de las operaciones de mantenimientoAfter maintenance operations

Considere la actualización de las estadísticas después de haber realizado procedimientos de mantenimiento que cambian la distribución de los datos, como truncar una tabla o realizar una inserción masiva de un porcentaje grande de las filas.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. Esto puede evitar los retrasos futuros en el procesamiento de la consulta, mientras las consultas esperan las actualizaciones automáticas de las estadísticas.This can avoid future delays in query processing while queries wait for automatic statistics updates.

Otras operaciones, como regenerar, desfragmentar o reorganizar un índice, no cambian la distribución de los datos.Operations such as rebuilding, defragmenting, or reorganizing an index do not change the distribution of data. Por consiguiente, no necesita actualizar las estadísticas después de realizar las operaciones ALTER INDEX REBUILD, DBCC DBREINDEX, DBCC INDEXDEFRAG o ALTER INDEX REORGANIZE.Therefore, you do not need to update statistics after performing ALTER INDEX REBUILD, DBCC DBREINDEX, DBCC INDEXDEFRAG, or ALTER INDEX REORGANIZE operations. El Optimizador de consultas actualiza las estadísticas cuando regenera un índice en una tabla o vista con ALTER INDEX REBUILD o DBCC DBREINDEX. Sin embargo, esta actualización de las estadísticas es un subproducto de la recreación del índice.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. El Optimizador de consultas no actualiza las estadísticas después de las operaciones DBCC INDEXDEFRAG o ALTER INDEX REORGANIZE.The Query Optimizer does not update statistics after DBCC INDEXDEFRAG or ALTER INDEX REORGANIZE operations.

Sugerencia

A partir de SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP1 CU4, utilice la opción PERSIST_SAMPLE_PERCENT de CREATE STATISTICS (Transact-SQL) o UPDATE STATISTICS (Transact-SQL) para establecer y mantener un porcentaje de muestreo específico para las actualizaciones de estadísticas posteriores en las que no se especifica explícitamente un porcentaje de muestreo.Starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x) 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.

Administración automática de índice y estadísticasAutomatic index and statistics management

Aproveche soluciones como la desfragmentación de índice adaptable para administrar automáticamente las actualizaciones de estadísticas y la desfragmentación de índices para una o varias bases de datos.Leverage solutions such as Adaptive Index Defrag to automatically manage index defragmentation and statistics updates for one or more databases. Este procedimiento elige automáticamente si se debe volver a generar o reorganizar un índice según su nivel de fragmentación, entre otros parámetros y actualiza las estadísticas con un umbral lineal.This procedure automatically chooses whether to rebuild or reorganize an index according to its fragmentation level, amongst other parameters, and update statistics with a linear threshold.

Consultas que usan eficazmente las estadísticasQueries that use statistics effectively

Algunas implementaciones de consulta, como las variables locales y las expresiones complejas en el predicado de consulta, pueden conducir a planes de consulta que no son óptimos.Certain query implementations, such as local variables and complex expressions in the query predicate, can lead to suboptimal query plans. Las siguientes instrucciones de diseño de consulta para el uso eficaz de las estadísticas pueden evitarlo.Following query design guidelines for using statistics effectively can help to avoid this. Para obtener más información sobre los predicados de consulta, vea Condición de búsqueda (Transact-SQL).For more information about query predicates, see Search Condition (Transact-SQL).

Puede mejorar los planes de consulta aplicando instrucciones de diseño de consulta que utilicen las estadísticas con eficacia para mejorar las estimaciones de cardinalidad en las expresiones, variables y funciones utilizadas en los predicados de consulta.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. Cuando el Optimizador de consultas no conoce el valor de una expresión, variable o función, no conoce qué valor ha de buscar en el histograma y, por consiguiente, no puede recuperar del histograma la mejor estimación de cardinalidad.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. En cambio, el Optimizador de consultas basa la estimación de cardinalidad en el número medio de filas por valor distinto para todas las filas buscadas en el histograma.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. El resultado son estimaciones de cardinalidad poco óptimas, además de dañar el rendimiento de la consulta.This leads to suboptimal cardinality estimates and can hurt query performance. Para más información sobre los histogramas, vea la sección Histograma en esta página o sys.dm_db_stats_histogram.For more information about histograms, see histogram section in this page or sys.dm_db_stats_histogram.

Las instrucciones siguientes describen cómo escribir las consultas para mejorar los planes de consulta mediante la mejora de las estimaciones de cardinalidad.The following guidelines describe how to write queries to improve query plans by improving cardinality estimates.

Mejora de las estimaciones de cardinalidad en las expresionesImproving cardinality estimates for expressions

Para mejorar las estimaciones de cardinalidad en las expresiones, siga estas instrucciones:To improve cardinality estimates for expressions, follow these guidelines:

  • Siempre que sea posible, simplifique las expresiones utilizando constantes.Whenever possible, simplify expressions with constants in them. El Optimizador de consultas no evalúa todas las funciones y expresiones que contienen constantes antes de determinar las estimaciones de cardinalidad.The Query Optimizer does not evaluate all functions and expressions containing constants prior to determining cardinality estimates. Por ejemplo, simplifique la expresión ABS(-100) en 100.For example, simplify the expression ABS(-100) to 100.

  • Si la expresión utiliza varias variables, considere la creación de una columna calculada para la expresión y, a continuación, cree estadísticas o un índice en la columna calculada.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. Por ejemplo, el predicado de consulta WHERE PRICE + Tax > 100 podría tener una mejor estimación de cardinalidad si crea una columna calculada para la expresión Price + Tax.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.

Mejora de las estimaciones de cardinalidad en las variables y funcionesImproving cardinality estimates for variables and functions

Para mejorar las estimaciones de cardinalidad en las variables y funciones, siga estas instrucciones:To improve the cardinality estimates for variables and functions, follow these guidelines:

  • Si el predicado de consulta utiliza una variable local, considere volver a escribir la consulta usando un parámetro en lugar de una variable local.If the query predicate uses a local variable, consider rewriting the query to use a parameter instead of a local variable. No se conoce el valor de una variable local cuando el Optimizador de consultas crea el plan de ejecución de la consulta.The value of a local variable is not known when the Query Optimizer creates the query execution plan. Cuando una consulta utiliza un parámetro, el Optimizador de consultas utiliza la estimación de cardinalidad para el primer valor de parámetro real que se pasa al procedimiento almacenado.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.

  • Le recomendamos que use una tabla estándar o una tabla temporal para retener los resultados de las funciones con valores de tabla de múltiples instrucciones (mstvf).Consider using a standard table or temporary table to hold the results of multi-statement table-valued functions (mstvf). El Optimizador de consultas no crea estadísticas para las funciones con valores de tabla de múltiples instrucciones.The Query Optimizer does not create statistics for multi-statement table-valued functions. Con este enfoque, el Optimizador de consultas puede crear estadísticas sobre las columnas de tabla y utilizarlas para crear un plan de consulta mejor.With this approach the Query Optimizer can create statistics on the table columns and use them to create a better query plan.

  • Considere el uso de una tabla estándar o una tabla temporal como un reemplazo para las variables de tabla.Consider using a standard table or temporary table as a replacement for table variables. El Optimizador de consultas no crea estadísticas para las variables de tabla.The Query Optimizer does not create statistics for table variables. Con este enfoque, el Optimizador de consultas puede crear estadísticas sobre las columnas de tabla y utilizarlas para crear un plan de consulta mejor.With this approach the Query Optimizer can create statistics on the table columns and use them to create a better query plan. Hay que determinar si se utilizar una tabla temporal o una variable de tabla; las variables de tabla utilizadas en los procedimientos almacenados causan menos recompilaciones del procedimiento almacenado que las tablas temporales.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. Dependiendo de la aplicación, el uso de una tabla temporal en lugar de una variable de tabla no mejora el rendimiento.Depending on the application, using a temporary table instead of a table variable might not improve performance.

  • Si un procedimiento almacenado contiene una consulta que utiliza un parámetro pasado, evite cambiar el valor del parámetro dentro del procedimiento almacenado antes de utilizarlo en la consulta.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. Las estimaciones de cardinalidad para la consulta se basan en el valor de parámetro pasado y no en el valor actualizado.The cardinality estimates for the query are based on the passed-in parameter value and not the updated value. Para evitar cambiar el valor del parámetro, puede reescribir la consulta para utilizar los dos procedimientos almacenados.To avoid changing the parameter value, you can rewrite the query to use two stored procedures.

    Por ejemplo, el procedimiento almacenado siguiente Sales.GetRecentSales cambia el valor del parámetro @date cuando @date es NULL.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  
    

    Si la primera llamada al procedimiento almacenado Sales.GetRecentSales pasa un NULL para el parámetro @date, el Optimizador de consultas compilará el procedimiento almacenado con la estimación de cardinalidad para @date = NULL aunque no se llame al predicado de consulta con @date = NULL.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. Esta estimación de cardinalidad podría ser significativamente diferente del número de filas del resultado de la consulta real.This cardinality estimate might be significantly different than the number of rows in the actual query result. Como resultado, el Optimizador de consultas podría elegir un plan de consulta poco óptimo.As a result, the Query Optimizer might choose a suboptimal query plan. Para ayudar a evitar esto, puede rescribir el procedimiento almacenado en dos procedimientos del modo siguiente: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  
    

Mejora de las estimaciones de cardinalidad con sugerencias de consultaImproving cardinality estimates with query hints

Para mejorar las estimaciones de cardinalidad para las variables locales, puede usar las sugerencias de consulta OPTIMIZE FOR <value> o OPTIMIZE FOR UNKNOWN con RECOMPILE.To improve cardinality estimates for local variables, you can use the OPTIMIZE FOR <value> or OPTIMIZE FOR UNKNOWN query hints with RECOMPILE. Para obtener más información, vea Sugerencias de consulta (Transact-SQL).For more information, see Query Hints (Transact-SQL).

En algunas aplicaciones, volver a compilar la consulta cada vez que la ejecuta podría tardar demasiado tiempo.For some applications, recompiling the query each time it executes might take too much time. La sugerencia de consulta OPTIMIZE FOR puede servir de ayuda incluso si no usa la opción RECOMPILE.The OPTIMIZE FOR query hint can help even if you don't use the RECOMPILE option. Por ejemplo, podría agregar una opción OPTIMIZE FOR al procedimiento almacenado Sales.GetRecentSales para especificar una fecha concreta.For example, you could add an OPTIMIZE FOR option to the stored procedure Sales.GetRecentSales to specify a specific date. En el ejemplo siguiente se agrega la opción OPTIMIZE FOR al procedimiento Sales.GetRecentSales.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  

Mejora de las estimaciones de cardinalidad con guías de planImproving cardinality estimates with Plan Guides

En algunas aplicaciones, podrían no aplicarse las instrucciones de diseño de consulta, porque no puede cambiar la consulta o porque usar la sugerencia de consulta RECOMPILE podría ser la causa de demasiadas recompilaciones.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. Puede utilizar las guías de plan para especificar otras sugerencias, como USE PLAN, para controlar el comportamiento de la consulta mientras investiga los cambios de la aplicación con el proveedor de la aplicación.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. Para obtener más información acerca de las guías de plan, vea Plan Guides.For more information about plan guides, see Plan Guides.

Consulte tambiénSee 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)
Opciones de ALTER DATABASE SET (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)
Creación de índices filtrados Create Filtered Indexes
Controlar el comportamiento de Autostat (AUTO_UPDATE_STATISTICS) en 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)
Desfragmentación de índice adaptableAdaptive Index Defrag