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. CREATE STATISTICS puede usar la base de datos tempdb para ordenar la muestra de filas con fines de compilación de 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.

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

    A continuación, se muestran algunos ejemplos de predicados de filtro para la tabla Production.BillOfMaterials:

    WHERE StartDate > '20040101' AND EndDate <= '20040630'

    WHERE ComponentID IN (533, 324, 753)

    WHERE StartDate IN ('20040404', '20040905') 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
    Deshabilite la opción automática de actualización de las estadísticas, AUTO_UPDATE_STATISTICS, para statistics_name. Si se especifica esta opción, el optimizador de consultas finalizará cualquier actualización de las estadísticas que se esté realizando para statistics_name 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
    Solamente se identifica con fines informativos. No compatible. La compatibilidad con versiones posteriores no está garantizada.

Comentarios

Puede mostrar hasta 32 columnas por objeto de estadísticas.

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

Necesita el permiso ALTER TABLE, el usuario debe ser propietario de la tabla o vista indizada, o debe ser miembro del rol fijo de base de datos 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 BusinessEntityID y EmailAddress de la tabla Person de la base de datos AdventureWorks2008R2.

USE AdventureWorks2008R2;
GO
CREATE STATISTICS ContactMail1
    ON Person.Person (BusinessEntityID, EmailPromotion)
    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 BusinessEntityID y EmailAddress de la tabla Person y se deshabilita la posibilidad de volver a calcular las estadísticas automáticamente.

CREATE STATISTICS NamePurchase
    ON AdventureWorks2008R2.Person.Person (BusinessEntityID, EmailPromotion)
    WITH FULLSCAN, NORECOMPUTE;

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

En el ejemplo siguiente se crean las estadísticas filtradas ContactPromotion1. El 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 AdventureWorks2008R2;
GO
IF EXISTS (SELECT name FROM sys.stats
    WHERE name = N'ContactPromotion1'
    AND object_id = OBJECT_ID(N'Person.Person'))
DROP STATISTICS Person.Person.ContactPromotion1
GO
CREATE STATISTICS ContactPromotion1
    ON Person.Person (BusinessEntityID, LastName, EmailPromotion)
WHERE EmailPromotion = 2
WITH SAMPLE 50 PERCENT;
GO