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 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.
Para obter mais informações sobre estatísticas, inclusive quando usar CREATE STATISTICS, consulte Usando estatísticas para melhorar o desempenho de consultas.
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 de tipo de dados CLR definido 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 de dados CLR definido pelo usuário, consulte Trabalhando com tipos de dados CLR definidos pelo usuário.
O tamanho máximo permitido dos valores de coluna combinados é de 900 bytes.
WHERE <predicado_filtro>
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 > '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 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 os exemplos do otimizador de consulta 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 amostra e computa o tamanho da amostra 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 nome_estatísticas. Se essa opção for especificada, o otimizador de consulta concluirá todas as atualizações de estatísticas em andamento para nome_estatísticas 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.
Cuidado 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. Não há suporte. A compatibilidade futura não está garantida.
Comentários
A tabela a seguir fornece os números máximos de categorias relacionadas às estatísticas.
Categoria de estatísticas |
Máximo |
---|---|
Colunas por objeto de estatísticas |
32 |
Estatísticas criadas em índices |
1 por índice e 1000 por tabela |
Estatísticas criadas em colunas |
30.000 por tabela |
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
Para criar estatísticas, o usuário deve ser o proprietário da tabela ou da exibição indexada ou ser membro de uma das seguintes funções: função de servidor fixa sysadmin, função de banco de dados fixa db_owner ou 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 ContactID e EmailAddress da tabela Contact do banco de dados AdventureWorks.
USE AdventureWorks;
GO
CREATE STATISTICS ContactMail1
ON Person.Contact (ContactID, EmailAddress)
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 ContactID e EmailAddress da tabela Contact e desabilita o recálculo de estatísticas.
CREATE STATISTICS NamePurchase
ON AdventureWorks.Person.Contact (ContactID, EmailAddress)
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 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
Histórico de alterações
Conteúdo atualizado |
---|
Revisões em todo o documento para aumentar a exatidão. |
O tópico refere-se ao novo conteúdo de estatísticas no tópico Usando estatísticas para melhorar o desempenho de consultas. |