Compartir a través de


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 FabricWarehouse en Microsoft FabricBase de datos SQL de 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 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 obtener más información sobre las estadísticas de Microsoft Fabric, consulte Estadísticas en el almacenamiento de datos de Fabric.

Convenciones de sintaxis de Transact-SQL

Sintaxis

Sintaxis para SQL Server y 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_constant ]

Sintaxis para Azure Synapse Analytics y Almacenamiento de datos paralelos.

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

Sintaxis de Microsoft Fabric.

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

Nota:

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

Argumentos

table_or_indexed_view_name

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

index_or_statistics_name o statistics_name | index_name o statistics_name

Nombre del índice en el que se van a actualizar las estadísticas o nombre de las estadísticas que se van a 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 mediante la CREATE STATISTICS instrucción , las estadísticas de una sola columna creadas cuando AUTO_CREATE_STATISTICS está activada y las estadísticas creadas para los índices.

Para obtener 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 usar con la SAMPLE opción .

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. Para PERCENT, el número puede ser de 0 a 100 y para ROWS, el número puede ser de 0 al 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 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 usa el muestreo y determina el tamaño de muestra estadísticamente significativo de forma predeterminada, según sea necesario 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 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 usar con la FULLSCAN opción . Cuando no se especifica ni SAMPLEFULLSCAN , el optimizador de consultas usa datos muestreados y calcula el tamaño de la muestra de forma predeterminada.

Se recomienda especificar 0 PERCENT o 0 ROWS. Cuando 0 PERCENT se especifica o 0 ROWS , el objeto statistics 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. Sin embargo, ciertas cargas de trabajo que son sensibles a distribuciones de datos muy variables pueden requerir un mayor tamaño de muestra 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 RESAMPLE de puede dar lugar a un examen de tabla completa. 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 ejemplo (SAMPLE, FULLSCAN, RESAMPLE), el optimizador de consultas muestra los datos y calcula el tamaño de la muestra de forma predeterminada.

En Almacenamiento en Microsoft Fabric, RESAMPLE no se admite.

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 ON, las estadísticas conservarán el porcentaje de muestreo establecido para las actualizaciones posteriores que no especifican explícitamente un porcentaje de muestreo. Cuando OFF, el porcentaje de muestreo de estadísticas se restablecerá al muestreo predeterminado en las actualizaciones posteriores que no especifican 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 AUTO_UPDATE_STATISTICS se ejecuta, usa el porcentaje de muestreo persistente si está disponible o usa el porcentaje de muestreo predeterminado si no lo está. RESAMPLE el comportamiento 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. De forma similar, si las estadísticas se actualizan en un objeto sin filas, se revierte al uso del porcentaje de muestreo predeterminado incluso si PERSIST_SAMPLE_PERCENT se configuró anteriormente.

Nota:

En SQL Server, al volver a generar un índice que anteriormente tenía estadísticas actualizadas con PERSIST_SAMPLE_PERCENT, el porcentaje de ejemplo persistente se restablece de nuevo 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 ( { <partition_number> | <range> } [ , ... n ] ) ]

Se aplica a: SQL Server 2014 (12.x) y versiones posteriores.

Fuerza las estadísticas de nivel hoja que abarcan las particiones especificadas en la ON PARTITIONS cláusula que se van a volver a calcular y, a continuación, se combinan para crear las estadísticas globales. WITH RESAMPLE es necesario porque las estadísticas de partición creadas con diferentes velocidades de muestreo no se pueden combinar juntas.

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 UPDATE STATISTICS instrucción actualiza todas las estadísticas de la tabla o vista indizada.

NORECOMPUTE

Deshabilite la opción de actualización automática de 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 volver a habilitar el comportamiento de la AUTO_UPDATE_STATISTICS opción, vuelva a ejecutar UPDATE STATISTICS sin la NORECOMPUTE opción 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 AUTO_STATISTICS_UPDATE opción, vea Opciones de ALTER DATABASE SET.

INCREMENTAL = { ON | OFF }

Se aplica a: SQL Server 2014 (12.x) y versiones posteriores.

Cuando ON, las estadísticas se vuelven a crear según las estadísticas de partición. Cuando OFF, el árbol de estadísticas se quita y SQL Server vuelve a calcular 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).

Invalida la max degree of parallelism opción de configuración 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. Use MAXDOP para limitar el número de procesadores usados en una ejecución de 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 menos en función de la carga de trabajo del sistema actual.

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 una herramienta de terceros crea estadísticas en una base de datos de cliente, esos objetos de estadísticas pueden bloquear o interferir con los cambios de esquema que el cliente podría desear.

(A partir de SQL Server 2022 (16.x))| Esta característica permite crear objetos de estadísticas en un modo de modo que un cambio de esquema no bloquear las estadísticas, sino que se quitarán las estadísticas. 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, las estadísticas creadas automáticamente siempre usan la eliminación automática. Algunas copias de seguridad, cuando se restauran, podrían 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.
  • No se admite la actualización de las estadísticas creadas automáticamente en cada índice de almacén de columnas. Al intentarlo, se produce el error 35337: UPDATE STATISTICS failed because statistics cannot be updated on a columnstore index. UPDATE STATISTICS is valid only when used with the STATS_STREAM option.
  • 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.

EXECUTE sp_updatestats;

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

Use soluciones como Desfragmentación de índices adaptables para administrar automáticamente las actualizaciones de estadísticas y desfragmentación de índices para una o varias bases de datos. Este procedimiento elige automáticamente si recompilar o reorganizar un índice según su nivel de fragmentación, entre otros parámetros, y actualizar las estadísticas con un umbral lineal.

Determinar la última actualización de estadísticas

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;