CREATE STATISTICS (Transact-SQL)

Crea estadísticas de optimización de consulta, incluyendo las estadísticas filtradas, en una o más columnas de una tabla o vista indizada. Para 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 mejorar el rendimiento de la consulta necesita crear estadísticas adicionales con CREATE STATISTICS modificar el diseño de la consulta.

Las estadísticas filtradas pueden mejorar el rendimiento de las consultas que se seleccionan desde subconjuntos de datos bien definidos. Las estadísticas filtradas utilizan un predicado de filtro de la cláusula WHERE para seleccionar el subconjunto de datos que se incluye en las estadísticas.

Para obtener más información acerca de las estadísticas, incluyendo cuándo utilizar CREATE STATISTICS, vea Utilizar las estadísticas para mejorar el rendimiento de las consultas.

Icono de vínculo a temasConvenciones de sintaxis de Transact-SQL

Sintaxis

CREATE STATISTICS statistics_name 
ON { table_or_indexed_view_name } ( column [ ,...n ] ) 
    [ WHERE <filter_predicate> ]
    [ WITH 
        [ [ FULLSCAN 
          | SAMPLE number { PERCENT | ROWS } 
          | STATS_STREAM = stats_stream ] [ , ] ] 
        [ NORECOMPUTE ] 
    ] ;

<filter_predicate> ::= 
    <conjunct> [AND <conjunct>]

<conjunct> ::=
    <disjunct> | <comparison>

<disjunct> ::=
        column_name IN (constant ,…)

<comparison> ::=
        column_name <comparison_op> constant

<comparison_op> ::=
    IS | IS NOT | = | <> | != | > | >= | !> | < | <= | !<

Argumentos

  • statistics_name
    Es el nombre de las estadísticas que se van a crear.

  • table_or_indexed_view_name
    Es el nombre de la tabla o vista indizada en la que se van a crear las estadísticas. Es posible crear estadísticas en las tablas o vistas indizadas de otra base de datos si se especifica un nombre de tabla completo.

  • column [ ,…n]
    Especifica la columna de clave o lista de columnas de clave en las que se van a crear las estadísticas. Se puede especificar cualquier columna que pueda ser especificada como columna de clave de índice con las siguientes excepciones:

    • No se puede especificar Xml, texto completo y columnas FILESTREAM.

    • Solamente se pueden especificar columnas calculadas si las opciones de base de datos ARITHABORT y QUOTED_IDENTIFIER están establecidas en ON.

    • Se pueden especificar columnas de tipo CLR definido por el usuario si el tipo admite el orden binario. Es posible especificar columnas calculadas definidas como llamadas a métodos de una columna de un tipo definido por el usuario si los métodos están marcados como deterministas. Para obtener más información acerca de la creación de columnas de tipo CLR definido por el usuario, vea Trabajar con tipos definidos por el usuario para CLR.

    El tamaño máximo permitido de los valores de columna combinada es 900 bytes.

  • WHERE <filter_predicate>
    Especifica una expresión para seleccionar un subconjunto de filas para incluir al crear el objeto estadísticas. Las estadísticas que se crean con un predicado de filtro se llaman estadísticas filtradas. El predicado de filtro utiliza la lógica de comparación simple y no puede hacer referencia a una columna calculada, una columna UDT, una columna de tipo de datos espacial o una columna de tipo de datos hierarchyID. Las comparaciones que utilizan literales NULL no se admiten con los operadores de comparación. En su lugar, use los operadores IS NULL e IS NOT NULL.

    Los siguientes son algunos ejemplos de predicados de filtro para la tabla Production.BillOfMaterials:

    WHERE StartDate > '20000101' AND EndDate <= '20000630'

    WHERE ComponentID IN (533, 324, 753)

    WHERE StartDate IN ('20000404', '20000905') AND EndDate IS NOT NULL

    Para obtener más información sobre predicados de filtro, vea Directrices generales para diseñar índices filtrados.

  • 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 }
    Especifica el porcentaje o número de filas aproximado de la tabla o vista indizada que usa el optimizador de consultas al crear 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 ya 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.

    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 crea pero no contiene datos de estadísticas.

  • NORECOMPUTE
    Deshabilita la opción automática de actualización de las estadísticas, AUTO_UPDATE_STATISTICS, para nombre_estadísticas. Si se especifica esta opción, el optimizador de consultas finalizará cualquier actualización de las estadísticas que se esté realizando para nombre_estadísticas y deshabilitará las actualizaciones futuras.

    Para volver a habilitar las actualizaciones de las estadísticas, quite las estadísticas con DROP STATISTICS y, a continuación, ejecute CREATE STATISTICS sin la opción NORECOMPUTE.

    Nota de advertenciaAdvertencia

    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 acerca de la opción AUTO_STATISTICS_UPDATE, vea Opciones de ALTER DATABASE SET (Transact-SQL). Para obtener más información acerca de cómo deshabilitar y volver a habilitar las actualizaciones de estadísticas, vea Utilizar las estadísticas para mejorar el rendimiento de las consultas.

  • STATS_STREAM **=**stats_stream
    Solo se identifica con fines informativos. No compatible. La compatibilidad con versiones posteriores no está garantizada.

Notas

En la tabla siguiente se proporcionan los números máximos para las categorías relacionadas con las estadísticas.

Categoría para estadísticas

Máximo

Columnas por objeto de estadísticas

32

Estadísticas creadas sobre índices

1 por índice y 1000 por tabla

Estadísticas creadas sobre columnas

30.000 por tabla

Cuándo utilizar CREATE STATISTICS

Para obtener más información acerca de cuándo usar CREATE STATISTICS, vea Utilizar las estadísticas para mejorar el rendimiento de las consultas.

Hacer referencia a las dependencias para las estadísticas filtradas

La vista de catálogo sys.sql_expression_dependencies realiza el seguimiento de cada columna de la expresión del predicado de estadísticas filtradas como una dependencia de referencia. Tenga en cuenta las operaciones que realiza en las columnas de la tabla antes de crear estadísticas filtradas, porque no puede quitar, modificar, cambiar el nombre de la definición de una columna de tabla definida en un predicado de estadísticas filtradas.

Permisos

Para crear estadísticas, el usuario debe ser el propietario de la tabla o vista indizada, o ser miembro de una de las funciones siguientes: función fija de servidor sysadmin, función de base de datos fija db_owner o función de base de datos fija db_ddladmin.

Ejemplos

A. Utilizar CREATE STATISTICS con SAMPLE number PERCENT

En el ejemplo siguiente se crean las estadísticas ContactMail1 a partir de una muestra aleatoria del 5 por ciento de las columnas ContactID y EmailAddress de la tabla Contact de la base de datos AdventureWorks.

USE AdventureWorks;
GO
CREATE STATISTICS ContactMail1
    ON Person.Contact (ContactID, EmailAddress)
    WITH SAMPLE 5 PERCENT;

B. Utilizar CREATE STATISTICS con FULLSCAN y NORECOMPUTE

En el ejemplo siguiente se crean las estadísticas ContactMail2 para todas las filas de las columnas ContactID y EmailAddress de la tabla Contact y se deshabilita la posibilidad de volver a calcular las estadísticas automáticamente.

CREATE STATISTICS NamePurchase
    ON AdventureWorks.Person.Contact (ContactID, EmailAddress)
    WITH FULLSCAN, NORECOMPUTE;

C. Utilizar CREATE STATISTICS para crear las estadísticas filtradas

En el ejemplo siguiente se crean las estadísticas filtradas ContactPromotion1. Database Engine (Motor de base de datos) muestrea el 50 por ciento de los datos y, a continuación, selecciona las filas cuyo valor EmailPromotion es igual a 2.

USE AdventureWorks;
GO
IF EXISTS (SELECT name FROM sys.stats
    WHERE name = N'ContactPromotion1'
    AND object_id = OBJECT_ID(N'Person.Contact'))
DROP STATISTICS Person.Contact.ContactPromotion1
GO
CREATE STATISTICS ContactPromotion1
    ON Person.Contact (ContactID, EmailAddress, EmailPromotion)
WHERE EmailPromotion = 2
WITH SAMPLE 50 PERCENT;
GO

Historial de cambios

Contenido actualizado

Revisiones en todo el documento para mejorar la corrección.

En el tema se hace referencia al nuevo contenido sobre estadísticas del tema Utilizar las estadísticas para mejorar el rendimiento de las consultas.