Compartilhar via


CREATE STATISTICS (Transact-SQL)

Cria estatísticas de otimização de consultas, inclusive estatísticas filtradas, em uma ou mais colunas de uma tabela ou exibição indexada. Para a maioria das consultas, o otimizador já gera as estatísticas necessárias para um plano de consulta de alta qualidade; em alguns casos, você precisa criar estatísticas adicionais com CREATE STATISTICS ou modificar o design de consulta para melhorar o desempenho de consulta.

Estatísticas filtradas podem melhorar o desempenho de consultas selecionadas em subconjuntos bem definidos de dados. Estatísticas filtradas usam um predicado de filtro na cláusula WHERE para selecionar o subconjunto de dados incluído nas estatísticas. CREATE STATISTICS pode usar tempdb para classificar o exemplo de linhas para criação de estatísticas.

Para obter mais informações sobre estatísticas, inclusive quando usar CREATE STATISTICS, consulte Usando estatísticas para melhorar o desempenho de consultas.

Ícone de vínculo de tópicoConvenções de sintaxe Transact-SQL

Sintaxe

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
    É o nome das estatísticas a serem criadas.

  • table_or_indexed_view_name
    É o nome da tabela ou da exibição indexada na qual criar as estatísticas. As estatísticas podem ser criadas em tabelas ou exibições indexadas em outro banco de dados especificando um nome de tabela qualificado.

  • column [ ,…n]
    Especifica a coluna de chave ou a lista de colunas de chave na qual criar as estatísticas. É possível especificar qualquer coluna que possa ser especificada como uma coluna de chave de índice com as seguintes exceções:

    • xml, de texto completo, e colunas FILESTREAM não podem ser especificadas.

    • As colunas computadas só poderão ser especificadas se as configurações de banco de dados ARITHABORT e QUOTED_IDENTIFIER forem ON.

    • As colunas do tipo CLR definidas pelo usuário poderão ser especificadas se o tipo der suporte à ordenação binária. As colunas computadas definidas como invocações de método de uma coluna de tipo definida pelo usuário poderão ser especificadas, se os métodos forem marcados como determinísticos. Para obter mais informações sobre como criar colunas do tipo CLR definido pelo usuário, consulte Trabalhando com tipos de dados CLR definidos pelo usuário.

  • WHERE <filter_predicate>
    Especifica uma expressão para selecionar um subconjunto de linhas a serem incluídas durante a criação do objeto de estatísticas. Estatísticas criadas com um predicado de filtro são chamadas de estatísticas filtradas. O predicado de filtro usa a lógica de comparação simples e não pode fazer referência a uma coluna computada, uma coluna UDT, uma coluna de tipo de dados espacial ou uma coluna de tipo de dados hierarchyID. As comparações que usam literais NULL não são permitidas com os operadores de comparação. Use os operadores IS NULL e IS NOT NULL em seu lugar.

    Estes são alguns exemplos de predicados de filtro para a tabela 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 obter mais informações sobre predicados de filtro, consulte Diretrizes de criação de índice filtrado.

  • FULLSCAN
    Compute as estatísticas examinando todas as linhas da tabela ou da exibição indexada. FULLSCAN e SAMPLE 100 PERCENT têm os mesmos resultados. FULLSCAN não pode ser usado com a opção SAMPLE.

  • SAMPLE number { PERCENT | ROWS }
    Especifica a porcentagem aproximada ou o número de linhas da tabela ou da exibição indexada para uso do otimizador de consulta ao criar as estatísticas. Para PERCENT, o number pode ser de 0 a 100 e para ROWS, o number pode ser de 0 até o número total de linhas. A porcentagem real ou o número de linhas que o otimizador de consulta usa como exemplo talvez não corresponda à porcentagem ou ao número especificado. Por exemplo, o otimizador de consulta examina todas as linhas de uma página de dados.

    SAMPLE é útil para casos especiais em que o plano de consulta, baseado na amostragem padrão, não é ideal. Na maioria das situações, não é necessário especificar SAMPLE porque o otimizador de consulta já usa amostragem e, por padrão, determina o tamanho da amostra estatisticamente significativa, conforme necessário, para criar planos de consulta de alta qualidade.

    SAMPLE não pode ser usado com a opção FULLSCAN. Quando nem SAMPLE nem FULLSCAN estão especificados, o otimizador de consulta usa dados de exemplo e computa o tamanho do exemplo por padrão.

    Recomendamos especificar 0 PERCENT ou 0 ROWS. Quando 0 PERCENT ou ROWS está especificado, o objeto de estatísticas é criado, mas não contém dados estatísticos.

  • NORECOMPUTE
    Desabilite a opção de atualização das estatísticas automáticas, AUTO_STATISTICS_UPDATE, para statistics_name. Se essa opção for especificada, o otimizador de consulta concluirá todas as atualizações de estatísticas em andamento para statistics_name e desabilitará atualizações futuras.

    Para reabilitar atualizações de estatísticas, remova as estatísticas com DROP STATISTICS e execute CREATE STATISTICS sem a opção NORECOMPUTE.

    Observação sobre cuidadosCuidado

    Usar essa opção pode produzir planos de consulta de qualidade inferior. É recomendável usar essa opção moderadamente e somente por um administrador de sistema qualificado.

    Para obter mais informações sobre a opção AUTO_STATISTICS_UPDATE, consulte Opções ALTER DATABASE SET (Transact-SQL). Para obter mais informações sobre como desabilitar e reabilitar atualizações de estatísticas, consulte Usando estatísticas para melhorar o desempenho de consultas.

  • STATS_STREAM **=**stats_stream
    Identificado apenas para fins informativos. Sem suporte. A compatibilidade futura não está garantida.

Comentários

Você pode listar até 32 colunas por objeto de estatística.

Quando usar CREATE STATISTICS

Para obter mais informações sobre quando usar CREATE STATISTICS, consulte Usando estatísticas para melhorar o desempenho de consultas.

Referenciando dependências de estatísticas filtradas

A exibição do catálogo sys.sql_expression_dependencies monitora cada coluna da do predicado de estatísticas filtradas como uma dependência de referência. Avalie as operações realizadas nas colunas da tabela antes de criar estatísticas filtradas, pois não será possível descartar, renomear ou alterar a definição de uma coluna da tabela que estiver definida em um predicado de estatísticas filtradas.

Permissões

Requer a permissão ALTER TABLE, ou o usuário deve ser proprietário da tabela ou exibição indexada ou ser membro de uma função de banco de dados fixa db_ddladmin.

Exemplos

A. Usando CREATE STATISTICS com SAMPLE número PERCENT

O exemplo a seguir cria a estatística ContactMail1 utilizando uma amostra aleatória de 5% das colunas BusinessEntityID e EmailAddress da tabela Person do banco de dados AdventureWorks2008R2.

USE AdventureWorks2008R2;
GO
CREATE STATISTICS ContactMail1
    ON Person.Person (BusinessEntityID, EmailPromotion)
    WITH SAMPLE 5 PERCENT;

B. Usando CREATE STATISTICS com FULLSCAN e NORECOMPUTE

O exemplo a seguir cria a estatística ContactMail2 de todas as linhas das colunas BusinessEntityID e EmailAddress da tabela Person e desabilita o recálculo de estatísticas.

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

C. Usando CREATE STATISTICS para criar estatísticas filtradas

O exemplo a seguir cria as estatísticas filtradas ContactPromotion1. O Mecanismo de Banco de Dados faz a amostragem de 50% dos dados e seleciona as linhas com EmailPromotion 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