Compartilhar via


CREATE STATISTICS (Transact-SQL)

Cria estatísticas de otimização de consulta, 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 da 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 a criação de estatísticas.

Para obter mais informações sobre estatísticas, inclusive quando usar CREATE STATISTICS, consulte Estatísticas.

Ícone de vínculo de tópico Convenções da 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 que devem ser criadas.

  • table_or_indexed_view_name
    É o nome da tabela ou exibição indexada na qual as estatísticas devem ser criadas. 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 as estatísticas devem ser criadas. É 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 poderão ser especificadas somente 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.

  • 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. As 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 da tabela 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 obter mais informações sobre predicados de filtro, consulte Criar índices filtrados.

  • FULLSCAN
    Calcule as estatísticas verificando 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 verifica 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

    O uso dessa 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 Estatísticas.

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

Quando usar CREATE STATISTICS

Para obter mais informações sobre quando usar CREATE STATISTICS, consulte Estatísticas.

Referenciando dependências de estatísticas filtradas

A exibição do catálogo sys.sql_expression_dependencies controla cada coluna 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 remover, renomear ou alterar a definição de uma coluna da tabela que esteja definida em um predicado de estatísticas filtradas.

Permissões

Exige a permissão ALTER TABLE, ou o usuário deve ser o proprietário da tabela ou exibição indexada, ou o usuário deve ser um membro da 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 EmailPromotion da tabela Contact do banco de dados AdventureWorks.

USE AdventureWorks2012;
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 EmailPromotion da tabela Contact e desabilita o recálculo de estatísticas.

CREATE STATISTICS NamePurchase
    ON AdventureWorks2012.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 então seleciona as linhas com EmailPromotion igual a 2.

USE AdventureWorks2012;
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

Consulte também

Referência

UPDATE STATISTICS (Transact-SQL)

sp_updatestats (Transact-SQL)

DBCC SHOW_STATISTICS (Transact-SQL)

DROP STATISTICS (Transact-SQL)

sys.stats (Transact-SQL)

sys.stats_columns (Transact-SQL)

Conceitos

Estatísticas