UPDATE STATISTICS (Transact-SQL)

Se aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Punto de conexión de análisis SQL en Microsoft FabricAlmacenamiento en Microsoft Fabric

Actualiza las estadísticas de optimización de consulta para una tabla o vista indizada. De forma predeterminada, el optimizador de consultas ya actualiza las estadísticas como requisito para mejorar el plan de consulta; en algunos casos puede mejorar el rendimiento de las consultas usando UPDATE STATISTICS o el procedimiento almacenado sp_updatestats para actualizar las estadísticas con más frecuencia que la de las actualizaciones predeterminadas.

La actualización de las estadísticas asegura que las consultas se compilan con estadísticas actualizadas. La actualización de las estadísticas a través de cualquier proceso puede hacer que los planes de consulta se vuelvan a compilar automáticamente. Recomendamos no actualizar las estadísticas con demasiada frecuencia, porque hay una compensación de rendimiento entre la mejora de los planes de consulta y el tiempo empleado en volver a compilar las consultas. Las compensaciones específicas dependen de su aplicación. UPDATE STATISTICS puede usar tempdb para ordenar la muestra de filas con fines de creación de estadísticas.

Nota:

Para más información sobre las estadísticas de Microsoft Fabric, consulte Estadísticas en Microsoft Fabric.

Convenciones de sintaxis de Transact-SQL

Sintaxis

-- Syntax for SQL Server and Azure SQL Database  
  
UPDATE STATISTICS table_or_indexed_view_name   
    [   
        {   
            { index_or_statistics__name }  
          | ( { index_or_statistics_name } [ ,...n ] )   
                }  
    ]   
    [    WITH   
        [  
            FULLSCAN   
              [ [ , ] PERSIST_SAMPLE_PERCENT = { ON | OFF } ]    
            | SAMPLE number { PERCENT | ROWS }   
              [ [ , ] PERSIST_SAMPLE_PERCENT = { ON | OFF } ]    
            | RESAMPLE   
              [ ON PARTITIONS ( { <partition_number> | <range> } [, ...n] ) ]  
            | <update_stats_stream_option> [ ,...n ]  
        ]   
        [ [ , ] [ ALL | COLUMNS | INDEX ]   
        [ [ , ] NORECOMPUTE ]   
        [ [ , ] INCREMENTAL = { ON | OFF } ] 
        [ [ , ] MAXDOP = max_degree_of_parallelism ]
        [ [ , ] AUTO_DROP = { ON | OFF } ]
    ] ;  
  
<update_stats_stream_option> ::=  
    [ STATS_STREAM = stats_stream ]  
    [ ROWCOUNT = numeric_constant ]  
    [ PAGECOUNT = numeric_contant ]  
-- Syntax for Azure Synapse Analytics and Parallel Data Warehouse 
  
UPDATE STATISTICS [ schema_name . ] table_name   
    [ ( { statistics_name | index_name } ) ]  
    [ WITH   
       {  
              FULLSCAN   
            | SAMPLE number PERCENT   
            | RESAMPLE   
        }  
    ]  
[;]  
-- Syntax for Microsoft Fabric

UPDATE STATISTICS [ schema_name . ] table_name   
    [ ( { statistics_name } ) ]  
    [ WITH   
       {  
              FULLSCAN   
            | SAMPLE number PERCENT   
        }  
    ]  
[;]  

Nota:

Para ver la sintaxis de Transact-SQL para SQL Server 2014 (12.x) y versiones anteriores, consulte Versiones anteriores de la documentación.

Nota:

El grupo de SQL sin servidor no admite esta sintaxis en Azure Synapse Analytics.

Argumentos

table_or_indexed_view_name

Es el nombre de la tabla o la vista indizada que contiene el objeto de estadísticas.

index_or_statistics_name o statistics_name | index_name o statistics_name

Es el nombre del índice cuyas estadísticas se van a actualizar o el nombre de las estadísticas que actualizar. Si no se especifican index_or_statistics_name o statistics_name, el optimizador de consultas actualiza todas las estadísticas de la tabla o la vista indexada. Esto incluye las estadísticas creadas usando la instrucción CREATE STATISTICS en las columnas, las estadísticas de columna única creadas cuando se usa AUTO_CREATE_STATISTICS y las estadísticas creadas para los índices.

Para más información sobre AUTO_CREATE_STATISTICS, vea Opciones de ALTER DATABASE SET. Para ver todos los índices para una tabla o vista, puede usar sp_helpindex.

FULLSCAN

Para calcular las estadísticas, examine todas las filas de la tabla o la vista indizada. FULLSCAN y SAMPLE 100 PERCENT tienen los mismos resultados. FULLSCAN no se puede utilizar con la opción SAMPLE.

SAMPLE number { PERCENT | ROWS }

Especifique el porcentaje aproximado o número de filas de la tabla o vista indizada que el optimizador de consultas usará al actualizar las estadísticas. En PERCENT, number puede tener un valor comprendido entre 0 y 100, mientras que en ROWS, number puede tener un valor comprendido entre 0 y el número total de filas. El porcentaje o número de filas real de los ejemplos del optimizador de consultas podría no coincidir con el porcentaje o el número especificado. Por ejemplo, el optimizador de consultas examina todas las filas en una página de datos.

SAMPLE es útil para los casos especiales en los que el plan de consulta, basado en el muestreo predeterminado, no es óptimo. En la mayoría de las situaciones, no es necesario especificar SAMPLE porque el optimizador de consultas utiliza el muestreo y determina el tamaño de muestra estadísticamente significativo de forma predeterminada, tal y como se exige para crear planes de consulta de alta calidad.

Nota:

En SQL Server 2016 (13.x) al usar el nivel de compatibilidad de la base de datos 130, el muestreo de datos para compilar estadísticas se realiza en paralelo para mejorar el rendimiento de la recopilación de estadísticas. El optimizador de consultas usará estadísticas de ejemplo paralelas siempre que un tamaño de tabla supere un umbral determinado. A partir de SQL Server 2017 (14.x), independientemente del nivel de compatibilidad de la base de datos, el comportamiento se cambió a usar un examen serie para evitar posibles problemas de rendimiento con esperas excesivas de LATCH. El resto del plan de consulta al actualizar las estadísticas mantendrá la ejecución en paralelo si está calificado.

SAMPLE no se puede utilizar con la opción FULLSCAN. Cuando no se especifica SAMPLE ni FULLSCAN, el optimizador de consultas utiliza los datos muestreados y calcula el tamaño de la muestra de forma predeterminada.

Recomendamos no especificar 0 PERCENT ni 0 ROWS. Cuando se especifican 0 PERCENT o ROWS, el objeto de estadísticas se actualiza pero no contiene datos de estadísticas.

Para la mayoría de las cargas de trabajo, no es necesario realizar un examen completo, sino tan solo un muestreo predeterminado. Pero para ciertas cargas de trabajo que son sensibles a distribuciones de datos muy diferentes, puede que sea necesario un tamaño de muestreo mayor o incluso un examen completo. Aunque las estimaciones pueden ser más precisas con un examen completo que un examen muestreado, es posible que los planes complejos no se beneficien considerablemente.

Para obtener más información, consulte Componentes y conceptos de estadísticas.

RESAMPLE

Se actualiza cada estadística utilizando su velocidad de muestra más reciente.

El uso de RESAMPLE puede producir un recorrido de tabla completo. Por ejemplo, las estadísticas de los índices utilizan un recorrido de tabla completo como su velocidad de muestra. Cuando no se especifica ninguna de las opciones de muestreo (SAMPLE, FULLSCAN ni RESAMPLE), el optimizador de consultas muestrea los datos y calcula el tamaño de la muestra de forma predeterminada.

En Almacenamiento en Microsoft Fabric, no se admite RESAMPLE.

PERSIST_SAMPLE_PERCENT = { ON | OFF }

Se aplica a: SQL Server 2016 (13.x) Service Pack 1 CU4, SQL Server 2017 (14.x) Service Pack 1, o SQL Server 2019 (15.x) y versiones posteriores, Azure SQL Database, Azure SQL Managed Instance

Cuando es ON, las estadísticas conservan el porcentaje de muestreo definido para las actualizaciones posteriores que no especifican explícitamente un porcentaje de muestreo. Cuando es OFF, el porcentaje de muestreo de estadísticas se restablece al muestreo predeterminado en actualizaciones posteriores que no especifiquen explícitamente un porcentaje de muestreo. El valor predeterminado es OFF.

DBCC SHOW_STATISTICS y sys.dm_db_stats_properties exponen el valor de porcentaje de muestreo persistente para la estadística seleccionada.

Si se ejecuta AUTO_UPDATE_STATISTICS, usa el porcentaje de muestreo persistente (si está disponible) o, de no ser así, el porcentaje de muestreo predeterminado. El comportamiento de RESAMPLE no se ve afectado por esta opción.

Si se trunca la tabla, todas las estadísticas creadas en el montículo o árbol B (HoBT) truncado volverán a usar el porcentaje de muestreo predeterminado.

Nota:

En SQL Server, al recompilar un índice que previamente tenía estadísticas actualizadas con PERSIST_SAMPLE_PERCENT, el porcentaje de muestra persistente se restablece al valor predeterminado. A partir de SQL Server 2016 (13.x) SP2 CU17, SQL Server 2017 (14.x)CU26 y SQL Server 2019 (15.x) CU10, el porcentaje de muestra persistente se mantiene incluso al recompilar un índice.

ON PARTITIONS ( { <número_de_partición> | <intervalo> } [, ...n] ) ]

Válido para SQL Server 2014 (12.x) y versiones posteriores.

Obliga a que se recalculen las estadísticas de nivel de hoja que abarcan las particiones especificadas en la cláusula ON PARTITIONS y, a continuación, se combinen para generar las estadísticas globales. WITH RESAMPLE es necesario porque no se pueden combinar estadísticas de partición generadas con distintas frecuencias de muestreo.

ALL | COLUMNS | INDEX

Actualice todas las estadísticas existentes, las estadísticas creadas en una o más columnas, o las estadísticas creadas para los índices. Si no se especifica ninguna de las opciones, la instrucción UPDATE STATISTICS actualiza todas las estadísticas en la tabla o vista indizada.

NORECOMPUTE

Deshabilite la opción automática de actualización de las estadísticas, AUTO_UPDATE_STATISTICS, para las estadísticas especificadas. Si se especifica esta opción, el optimizador de consultas completa esta actualización de estadísticas y deshabilita las actualizaciones futuras.

Para rehabilitar el comportamiento de la opción AUTO_UPDATE_STATISTICS, ejecute de nuevo UPDATE STATISTICS sin la opción NORECOMPUTE o ejecute sp_autostats.

Advertencia

Utilizar esta opción puede producir planes de consulta poco óptimos. Se recomienda usar esta opción con moderación y que lo haga únicamente un administrador de sistemas cualificado.

Para obtener más información sobre la opción AUTO_STATISTICS_UPDATE, vea Opciones de ALTER DATABASE SET.

INCREMENTAL = { ON | OFF }

Válido para SQL Server 2014 (12.x) y versiones posteriores.

Cuando se establece en ON, las estadísticas se vuelven a crear como estadísticas por partición. Cuando se establece en OFF, se quita el árbol de estadísticas y SQL Server recalcula las estadísticas. El valor predeterminado es OFF.

Si no se admiten las estadísticas por partición, se genera un error. Las estadísticas incrementales no se admiten para los siguientes tipos de estadísticas:

  • Estadísticas creadas con índices que no están alineados por partición con la tabla base.
  • Estadísticas creadas sobre bases de datos secundarias legibles AlwaysOn.
  • Estadísticas creadas sobre bases de datos de solo lectura.
  • Estadísticas creadas sobre índices filtrados.
  • Estadísticas creadas sobre vistas.
  • Estadísticas creadas sobre tablas internas.
  • Estadísticas creadas con índices espaciales o índices XML.

MAXDOP = max_degree_of_parallelism

Se aplica a: SQL Server (a partir de SQL Server 2016 (13.x) SP2 y SQL Server 2017 (14.x) CU3).

Reemplaza la opción de configuración max degree of parallelism durante la operación estadística. Para obtener más información, vea Establecer la opción de configuración del servidor Grado máximo de paralelismo. Utilice MAXDOP para establecer un límite para el número de procesadores utilizados en la ejecución de un plan paralelo. El máximo es 64 procesadores.

max_degree_of_parallelism puede tener estos valores:

1
Suprime la generación de planes paralelos.

>1 Restringe el número máximo de procesadores usados en una operación estadística paralela al número especificado o a un número inferior, en función de la carga de trabajo actual del sistema.

0 (valor predeterminado)
Usa el número real de procesadores o menos, según la carga de trabajo actual del sistema.

update_stats_stream_option

Solamente se identifica con fines informativos. No compatible. La compatibilidad con versiones posteriores no está garantizada.

AUTO_DROP = { ON | OFF }

Se aplica a: SQL Server 2022 (16.x) y versiones posteriores.

Actualmente, si se crean estadísticas con una herramienta de terceros en una base de datos de clientes, esos objetos de estadísticas pueden bloquear o interferir con los cambios de esquema que el cliente puede desear.

(A partir de SQL Server 2022 [16.x])| Esta característica permite la creación de objetos de estadísticas en un modo tal que las estadísticas no bloquean un cambio de esquema, sino que las estadísticas se quitan. De esta manera, las estadísticas de eliminación automática se comportan como las estadísticas creadas automáticamente.

Nota:

Si se intenta establecer o anular la propiedad Auto_Drop en las estadísticas creadas automáticamente, se pueden producir errores: las estadísticas creadas automáticamente siempre usan la eliminación automática. Algunas copias de seguridad, cuando se restauran, pueden tener esta propiedad establecida incorrectamente hasta la próxima vez que se actualice el objeto de estadísticas (manual o automáticamente). Sin embargo, las estadísticas creadas automáticamente siempre se comportan como estadísticas de eliminación automática.

Comentarios

Cuándo usar UPDATE STATISTICS

Para obtener más información sobre cuándo usar UPDATE STATISTICS, vea Cuándo actualizar estadísticas.

Limitaciones

  • No se admite la actualización de estadísticas en tablas externas. Para actualizar las estadísticas en una tabla externa, quite las estadísticas y vuelva a crearlas.
  • La opción MAXDOP no es compatible con las opciones STATS_STREAM, ROWCOUNT y PAGECOUNT.
  • La opción MAXDOP está limitada por la configuración MAX_DOP del grupo de cargas de trabajo de Resource Governor, si se usa.

Actualización de todas las estadísticas con sp_updatestats

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. Por ejemplo, el comando siguiente llama a sp_updatestats para actualizar todas las estadísticas de la base de datos.

EXEC sp_updatestats;  

Administración automática de índice y estadísticas

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

Determinar la actualización de estadísticas más reciente

Para saber cuándo se actualizaron las estadísticas por última vez, use la función STATS_DATE .

PDW / Azure Synapse Analytics

La sintaxis siguiente no es compatible con Analytics Platform System (PDW) o Azure Synapse Analytics:

UPDATE STATISTICS t1 (a,b);   
UPDATE STATISTICS t1 (a) WITH SAMPLE 10 ROWS;  
UPDATE STATISTICS t1 (a) WITH NORECOMPUTE;  
UPDATE STATISTICS t1 (a) WITH INCREMENTAL = ON;  
UPDATE STATISTICS t1 (a) WITH stats_stream = 0x01;  

Permisos

Debe tener un permiso de ALTER sobre la tabla o vista.

Ejemplos

A. Actualizar todas las estadísticas en una tabla

En este ejemplo se actualizan todas las estadísticas en la tabla SalesOrderDetail.

USE AdventureWorks2022;  
GO  
UPDATE STATISTICS Sales.SalesOrderDetail;  
GO  

B. Actualizar las estadísticas para un índice

En este ejemplo se actualizan las estadísticas del índice AK_SalesOrderDetail_rowguid de la tabla SalesOrderDetail.

USE AdventureWorks2022;  
GO  
UPDATE STATISTICS Sales.SalesOrderDetail AK_SalesOrderDetail_rowguid;  
GO  

C. Actualizar las estadísticas con un muestreo del 50 %

En este ejemplo se crean y, después, se actualizan las estadísticas de las columnas Name y ProductNumber de la tabla Product.

USE AdventureWorks2022;
GO  
CREATE STATISTICS Products
    ON Production.Product ([Name], ProductNumber)
    WITH SAMPLE 50 PERCENT
-- Time passes. The UPDATE STATISTICS statement is then executed.
UPDATE STATISTICS Production.Product(Products)
    WITH SAMPLE 50 PERCENT;

D. Actualizar estadísticas utilizando FULLSCAN y NORECOMPUTE

En este ejemplo se actualizan las estadísticas de Products de la tabla Product, se exige un examen completo de todas las filas de la tabla Product y se desactivan las estadísticas automáticas para las estadísticas de Products.

USE AdventureWorks2022;  
GO  
UPDATE STATISTICS Production.Product(Products)  
    WITH FULLSCAN, NORECOMPUTE;  
GO  

Ejemplos: Azure Synapse Analytics y Sistema de la plataforma de análisis (PDW)

E. Actualizar estadísticas en una tabla

En este ejemplo se actualizan las estadísticas de CustomerStats1 en la tabla Customer.

UPDATE STATISTICS Customer (CustomerStats1);  

F. Actualizar estadísticas mediante un examen completo

En este ejemplo se actualizan las estadísticas de CustomerStats1, en función del examen de todas las filas de la tabla Customer.

UPDATE STATISTICS Customer (CustomerStats1) WITH FULLSCAN;  

G. Actualizar todas las estadísticas en una tabla

En este ejemplo se actualizan todas las estadísticas en la tabla Customer.

UPDATE STATISTICS Customer;

H. Uso de CREATE STATISTICS con AUTO_DROP

Para usar las estadísticas de eliminación automática, basta con agregar lo siguiente a la cláusula "WITH" de creación o actualización de estadísticas.

UPDATE STATISTICS Customer (CustomerStats1) WITH AUTO_DROP = ON