EstatísticasStatistics

APLICA-SE A: simSQL Server simBanco de Dados SQL do Azure simSQL Data Warehouse do Azure simParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

O otimizador de consulta usa estatísticas para criar planos de consulta que melhoram o desempenho das consultas.The Query Optimizer uses statistics to create query plans that improve query performance. Para a maioria das consultas, o otimizador de consulta já gera as estatísticas necessárias para um plano de consulta de alta qualidade. Em alguns casos, é necessário criar estatísticas adicionais ou modificar o design da consulta para obter melhores resultados.For most queries, the Query Optimizer already generates the necessary statistics for a high quality query plan; in some cases, you need to create additional statistics or modify the query design for best results. Este tópico aborda os conceitos de estatísticas e fornece diretrizes para o uso eficiente de estatísticas de otimização de consultas.This topic discusses statistics concepts and provides guidelines for using query optimization statistics effectively.

Componentes e conceitosComponents and Concepts

EstatísticasStatistics

As estatísticas de otimização de consulta são BLOBs (objetos binários grandes) que contêm informações estatísticas sobre a distribuição de valores em uma ou mais colunas de uma tabela ou exibição indexada.Statistics for query optimization are binary large objects (BLOBs) that contain statistical information about the distribution of values in one or more columns of a table or indexed view. O otimizador de consulta usa essas estatísticas para estimar a cardinalidade ou o número de linhas no resultado de consulta.The Query Optimizer uses these statistics to estimate the cardinality, or number of rows, in the query result. Essas estimativas de cardinalidade permitem ao otimizador de consulta criar um plano de consulta de alta qualidade.These cardinality estimates enable the Query Optimizer to create a high-quality query plan. Por exemplo, dependendo dos predicados, o Otimizador de Consulta pode usar estimativas de cardinalidade para escolher o operador Index Seek em vez de o operador Index Scan, que utiliza mais recursos, melhorando com isso o desempenho das consultas.For example, depending on your predicates, the Query Optimizer could use cardinality estimates to choose the index seek operator instead of the more resource-intensive index scan operator, if doing so improves query performance.

Cada objeto de estatísticas é criado em uma lista de uma ou mais colunas de tabela e inclui um histograma que exibe a distribuição de valores na primeira coluna.Each statistics object is created on a list of one or more table columns and includes a histogram displaying the distribution of values in the first column. Os objetos de estatísticas em várias colunas também armazenam informações estatísticas sobre a correlação de valores entre as colunas.Statistics objects on multiple columns also store statistical information about the correlation of values among the columns. Essas estatísticas de correlação, ou densidades, são derivadas do número de linhas distintas de valores de coluna.These correlation statistics, or densities, are derived from the number of distinct rows of column values.

HistogramaHistogram

Um histograma mede a frequência de ocorrência de cada valor distinto em um conjunto de dados.A histogram measures the frequency of occurrence for each distinct value in a data set. O otimizador de consulta calcula um histograma com base nos valores de coluna na primeira coluna de chave do objeto de estatísticas, selecionando os valores de coluna por amostragem estatística das linhas ou pela execução de uma verificação completa de todas as linhas na tabela ou na exibição.The query optimizer computes a histogram on the column values in the first key column of the statistics object, selecting the column values by statistically sampling the rows or by performing a full scan of all rows in the table or view. Se o histograma for criado com base em um conjunto amostrado de linhas, os totais armazenados para o número de linhas e o número de valores distintos são estimativas e não precisam ser números inteiros.If the histogram is created from a sampled set of rows, the stored totals for number of rows and number of distinct values are estimates and do not need to be whole integers.

Observação

Os histogramas do SQL ServerSQL Server são criados apenas para uma única coluna, ou seja, a primeira coluna do conjunto de colunas de chave do objeto de estatísticas.Histograms in SQL ServerSQL Server are only built for a single column-the first column in the set of key columns of the statistics object.

Para criar o histograma, o otimizador de consulta classifica os valores de colunas, calcula o número de valores que correspondem a cada valor de coluna distinta e agrega os valores de colunas em um máximo de 200 etapas de histograma contíguas.To create the histogram, the query optimizer sorts the column values, computes the number of values that match each distinct column value and then aggregates the column values into a maximum of 200 contiguous histogram steps. Cada etapa do histograma inclui uma gama de valores de coluna seguidos por um valor de coluna de limite superior.Each histogram step includes a range of column values followed by an upper bound column value. O intervalo inclui todos os possíveis valores de coluna entre valores de limite, excluindo-se os próprios valores de limite em si.The range includes all possible column values between boundary values, excluding the boundary values themselves. O mais baixo dos valores de coluna classificados é o valor do limite superior da primeira etapa do histograma.The lowest of the sorted column values is the upper boundary value for the first histogram step.

Mais detalhadamente, o SQL ServerSQL Server cria o histograma com base no conjunto classificado de valores de coluna em três etapas:In more detail, SQL ServerSQL Server creates the histogram from the sorted set of column values in three steps:

  • Inicialização do histograma: na primeira etapa, uma sequência de valores que começa no início do conjunto classificado é processada e até 200 valores de range_high_key, equal_rows, range_rows e distinct_range_rows são coletados (range_rows e distinct_range_rows são sempre zero durante essa etapa).Histogram initialization: In the first step, a sequence of values starting at the beginning of the sorted set is processed, and up to 200 values of range_high_key, equal_rows, range_rows, and distinct_range_rows are collected (range_rows and distinct_range_rows are always zero during this step). A primeira etapa termina quando toda a entrada foi esgotada ou quando 200 valores foram encontrados.The first step ends either when all input has been exhausted, or when 200 values have been found.
  • Examinar com a mesclagem de bucket: cada valor adicional da coluna inicial da chave de estatísticas é processado na segunda etapa, na ordem classificada; cada valor sucessivo é adicionado ao último intervalo ou um novo intervalo no final é criado (isso é possível porque os valores de entrada são classificados).Scan with bucket merge: Each additional value from the leading column of the statistics key is processed in the second step, in sorted order; each successive value is either added to the last range or a new range at the end is created (this is possible because the input values are sorted). Se um novo intervalo for criado, um par dos intervalos vizinhos existentes será recolhido em um único intervalo.If a new range is created, then one pair of existing, neighboring ranges is collapsed into a single range. Esse par de intervalos é selecionado para minimizar a perda de informações.This pair of ranges is selected in order to minimize information loss. Esse método usa um algoritmo de diferença máxima para minimizar o número de etapas no histograma enquanto maximiza a diferença entre os valores de limite.This method uses a maximum difference algorithm to minimize the number of steps in the histogram while maximizing the difference between the boundary values. O número de etapas após o recolhimento dos intervalos permanece em 200 durante toda esta etapa.The number of steps after collapsing ranges stays at 200 throughout this step.
  • Consolidação do histograma: na terceira etapa, mais intervalos podem ser recolhidos se uma quantidade significativa de informações não é perdida.Histogram consolidation: In the third step, more ranges may be collapsed if a significant amount of information is not lost. O número de etapas do histograma pode ser menor do que o número de valores distintos, até mesmo para colunas com menos de 200 pontos de limite.The number of histogram steps can be fewer than the number of distinct values, even for columns with fewer than 200 boundary points. Portanto, mesmo se a coluna tiver mais de 200 valores exclusivos, o histograma poderá ter menos de 200 etapas.Therefore, even if the column has more than 200 unique values, the histogram may have less than 200 steps. Para uma coluna que consiste apenas em valores exclusivos, o histograma consolidado terá um mínimo de três etapas.For a column consisting of only unique values, then the consolidated histogram will have a minimum of three steps.

Observação

Se o histograma foi criado com uma amostra em vez de com a opção fullscan, os valores de equal_rows, range_rows, distinct_range_rows e average_range_rows são estimados e, portanto, não precisam ser inteiros.If the histogram has been built using a sample rather than fullscan, then the values of equal_rows, range_rows, and distinct_range_rows and average_range_rows are estimated, and therefore they do not need to be whole integers.

O diagrama a seguir mostra um histograma com seis etapas:The following diagram shows a histogram with six steps. A área à esquerda do primeiro valor do limite superior corresponde à primeira etapa.The area to the left of the first upper boundary value is the first step.

Para cada etapa do histograma acima:For each histogram step above:

  • A linha em negrito representa o valor do limite superior (range_high_key) e o número de vezes que ele ocorre (equal_rows)Bold line represents the upper boundary value (range_high_key) and the number of times it occurs (equal_rows)

  • A área sólida à esquerda de range_high_key representa o intervalo de valores de coluna e o número médio de vezes que cada valor de coluna ocorre (average_range_rows).Solid area left of range_high_key represents the range of column values and the average number of times each column value occurs (average_range_rows). As average_range_rows da primeira etapa do histograma são sempre 0.The average_range_rows for the first histogram step is always 0.

  • As linhas pontilhadas representam os valores amostrados usados para estimar o número total de valores distintos no intervalo (distinct_range_rows) e o número total de valores no intervalo (range_rows).Dotted lines represent the sampled values used to estimate total number of distinct values in the range (distinct_range_rows) and total number of values in the range (range_rows). O otimizador de consulta usa range_rows e distinct_range_rows para calcular average_range_rows e não armazena os valores amostrados.The query optimizer uses range_rows and distinct_range_rows to compute average_range_rows and does not store the sampled values.

Vetor de densidadeDensity Vector

Densidade são informações sobre o número de duplicatas em determinada coluna ou em uma combinação de colunas e ele é calculada como 1/(número de valores distintos).Density is information about the number of duplicates in a given column or combination of columns and it is calculated as 1/(number of distinct values). O otimizador de consulta usa densidades para aprimorar as estimativas de cardinalidade de consultas que retornam várias colunas da mesma tabela ou exibição indexada.The query optimizer uses densities to enhance cardinality estimates for queries that return multiple columns from the same table or indexed view. Conforme a densidade diminui, aumenta a seletividade de um valor.As density decreases, selectivity of a value increases. Por exemplo, em uma tabela que representa carros, muitos carros têm o mesmo fabricante, mas cada carro tem um VIN (número de identificação de veículo) exclusivo.For example, in a table representing cars, many cars have the same manufacturer, but each car has a unique vehicle identification number (VIN). Um índice no VIN é mais seletivo que um índice no fabricante, porque o VIN tem densidade menor que o fabricante.An index on the VIN is more selective than an index on the manufacturer, because VIN has lower density than manufacturer.

Observação

Frequência são informações sobre a ocorrência de cada valor distinto na primeira coluna de chave do objeto de estatísticas e é calculada como a contagem de linhas * densidade.Frequency is information about the occurrence of each distinct value in the first key column of the statistics object, and is calculated as row count * density. Uma frequência máxima igual a 1 pode ser encontrada em colunas com valores exclusivos.A maximum frequency of 1 can be found in columns with unique values.

O vetor de densidade contém uma densidade para cada prefixo de colunas no objeto de estatísticas.The density vector contains one density for each prefix of columns in the statistics object. Por exemplo, se um objeto de estatísticas tiver as colunas de chave CustomerId, ItemId e Price, a densidade será calculada em cada um dos prefixos de coluna a seguir.For example, if a statistics object has the key columns CustomerId, ItemId and Price, density is calculated on each of the following column prefixes.

Prefixo de colunaColumn prefix Densidade calculada emDensity calculated on
(CustomerId)(CustomerId) Linhas com valores correspondentes para CustomerId.Rows with matching values for CustomerId
(CustomerId, ItemId)(CustomerId, ItemId) Linhas com valores correspondentes para CustomerId e ItemIdRows with matching values for CustomerId and ItemId
(CustomerId, ItemId, Price)(CustomerId, ItemId, Price) Linhas com valores correspondentes para CustomerId, ItemId e PriceRows with matching values for CustomerId, ItemId, and Price

Estatísticas filtradasFiltered Statistics

As estatísticas filtradas podem melhorar o desempenho de consultas selecionadas em subconjuntos bem definidos de dados.Filtered statistics can improve query performance for queries that select from well-defined subsets of data. As estatísticas filtradas usam um predicado do filtro para selecionar o subconjunto de dados incluído nas estatísticas.Filtered statistics use a filter predicate to select the subset of data that is included in the statistics. Estatísticas filtradas bem projetadas podem aprimorar o plano de execução de consultas em comparação com as estatísticas de tabela completa.Well-designed filtered statistics can improve the query execution plan compared with full-table statistics. Para obter mais informações sobre o predicado de filtro, veja CREATE STATISTICS (Transact-SQL).For more information about the filter predicate, see CREATE STATISTICS (Transact-SQL). Para obter mais informações sobre quando criar estatísticas filtradas, consulte a seção Quando criar estatísticas neste tópico.For more information about when to create filtered statistics, see the When to Create Statistics section in this topic.

Opções de estatísticasStatistics Options

Há três opções que você pode definir que afetam quando e como as estatísticas são criadas e atualizadas.There are three options that you can set that affect when and how statistics are created and updated. Estas opções são definidas no nível do banco de dados somente.These options are set at the database level only.

Opção AUTO_CREATE_STATISTICSAUTO_CREATE_STATISTICS Option

Quando a opção de criação automática de estatísticas, AUTO_CREATE_STATISTICS, está ativada, o otimizador de consulta cria estatísticas em colunas individuais no predicado da consulta, conforme necessário, a fim de melhorar as estimativas de cardinalidade do plano de consulta.When the automatic create statistics option, AUTO_CREATE_STATISTICS is ON, the Query Optimizer creates statistics on individual columns in the query predicate, as necessary, to improve cardinality estimates for the query plan. Essas estatísticas de coluna única são criadas em colunas que ainda não têm um histograma em um objeto de estatísticas existente.These single-column statistics are created on columns that do not already have a histogram in an existing statistics object. A opção AUTO_CREATE_STATISTICS não determina se são criadas estatísticas para índices.The AUTO_CREATE_STATISTICS option does not determine whether statistics get created for indexes. Essa opção também não gera estatísticas filtradas.This option also does not generate filtered statistics. Ela se aplica estritamente a estatísticas de coluna única para a tabela completa.It applies strictly to single-column statistics for the full table.

Quando o otimizador de consulta cria estatísticas como resultado do uso da opção AUTO_CREATE_STATISTICS, os nomes das estatísticas começam com _WA.When the Query Optimizer creates statistics as a result of using the AUTO_CREATE_STATISTICS option, the statistics name starts with _WA. Você pode usar a consulta a seguir para determinar se o otimizador de consulta criou estatísticas para uma coluna de predicado de consulta.You can use the following query to determine if the Query Optimizer has created statistics for a query predicate column.

SELECT OBJECT_NAME(s.object_id) AS object_name,  
    COL_NAME(sc.object_id, sc.column_id) AS column_name,  
    s.name AS statistics_name  
FROM sys.stats AS s 
INNER JOIN sys.stats_columns AS sc  
    ON s.stats_id = sc.stats_id AND s.object_id = sc.object_id  
WHERE s.name like '_WA%'  
ORDER BY s.name;  

Opção AUTO_UPDATE_STATISTICSAUTO_UPDATE_STATISTICS Option

Quando a opção de atualização automática de estatísticas, AUTO_UPDATE_STATISTICS, está ativada, o otimizador de consulta determina quando as estatísticas podem estar desatualizadas e as atualiza quando são usadas por uma consulta.When the automatic update statistics option, AUTO_UPDATE_STATISTICS is ON, the Query Optimizer determines when statistics might be out-of-date and then updates them when they are used by a query. As estatísticas ficam desatualizadas depois que operações de inserção, atualização, exclusão ou mesclagem alteram a distribuição de dados na tabela ou na exibição indexada.Statistics become out-of-date after insert, update, delete, or merge operations change the data distribution in the table or indexed view. O otimizador de consulta determina quando estatísticas podem estar desatualizadas contando o número de modificações de dados desde a última atualização das estatísticas e comparando o número de modificações a um limite.The Query Optimizer determines when statistics might be out-of-date by counting the number of data modifications since the last statistics update and comparing the number of modifications to a threshold. O limite se baseia no número de linhas na tabela ou na exibição indexada.The threshold is based on the number of rows in the table or indexed view.

  • Até o SQL Server 2014 (12.x)SQL Server 2014 (12.x), o SQL ServerSQL Server usa um limite com base na porcentagem de linhas alteradas.Up to SQL Server 2014 (12.x)SQL Server 2014 (12.x), SQL ServerSQL Server uses a threshold based on the percent of rows changed. Isso ocorre independentemente do número de linhas na tabela.This is regardless of the number of rows in the table. O limite é:The threshold is:

    • Se a cardinalidade da tabela era de 500 ou menos quando as estatísticas foram avaliadas, é necessário atualizar a cada 500 modificações.If the table cardinality was 500 or less at the time statistics were evaluated, update for every 500 modifications.
    • Se a cardinalidade da tabela era inferior a 500 quando as estatísticas foram avaliadas, é necessário atualizar a cada 500 + 20% de modificações.If the table cardinality was above 500 at the time statistics were evaluated, update for every 500 + 20 percent of modifications.
  • Começando com o SQL Server 2016 (13.x)SQL Server 2016 (13.x) e no nível de compatibilidade de banco de dados 130, o SQL ServerSQL Server usa um limite de atualização de estatística dinâmico e decrescente, ajustado de acordo com o número de linhas da tabela.Starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x) and under the database compatibility level 130, SQL ServerSQL Server uses a decreasing, dynamic statistics update threshold that adjusts according to the number of rows in the table. Isso é calculado como a raiz quadrada do produto de 1000 e da cardinalidade da tabela atual.This is calculated as the square root of the product of 1000 and the current table cardinality. Por exemplo, se a tabela contiver 2 milhões de linhas, o cálculo será sqrt (1000 * 2000000) = 44721,359.For example if your table contains 2 million rows, then the calculation is? sqrt (1000 * 2000000) = 44721.359. Com essa alteração, as estatísticas em tabelas grandes serão atualizadas com mais frequência.With this change, statistics on large tables will be updated more often. No entanto, quando um banco de dados tem um nível de compatibilidade inferior a 130, aplica-se o limite do SQL Server 2014 (12.x)SQL Server 2014 (12.x).However, if a database has a compatibility level below 130, then the SQL Server 2014 (12.x)SQL Server 2014 (12.x) threshold applies. ??

Importante

Começando com o SQL Server 2008 R2SQL Server 2008 R2 pelo SQL Server 2014 (12.x)SQL Server 2014 (12.x) ou em SQL Server 2016 (13.x)SQL Server 2016 (13.x) pelo SQL Server 2017SQL Server 2017 no nível de compatibilidade de banco de dados inferior a 130, use o sinalizador de rastreamento 2371 e o SQL ServerSQL Server usará um limite de atualização de estatística dinâmico e decrescente, ajustado de acordo com o número de linhas da tabela.Starting with SQL Server 2008 R2SQL Server 2008 R2 through SQL Server 2014 (12.x)SQL Server 2014 (12.x), or in SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017 under database compatibility level lower than 130, use trace flag 2371 and SQL ServerSQL Server will use a decreasing, dynamic statistics update threshold that adjusts according to the number of rows in the table.

O otimizador de consulta procura estatísticas desatualizadas antes de compilar uma consulta e antes de executar um plano de consulta em cache.The Query Optimizer checks for out-of-date statistics before compiling a query and before executing a cached query plan. Antes de compilar uma consulta, o otimizador usa as colunas, tabelas e exibições indexadas no predicado de consulta para determinar quais estatísticas podem estar desatualizadas.Before compiling a query, the Query Optimizer uses the columns, tables, and indexed views in the query predicate to determine which statistics might be out-of-date. Antes de executar um plano de consulta em cache, o Mecanismo de Banco de DadosDatabase Engine verifica se o plano de consulta faz referência a estatísticas atualizadas.Before executing a cached query plan, the Mecanismo de Banco de DadosDatabase Engine verifies that the query plan references up-to-date statistics.

A opção AUTO_UPDATE_STATISTICS se aplica a objetos de estatísticas criados para índices, colunas únicas em predicados de consulta e estatísticas criadas com a instrução CREATE STATISTICS .The AUTO_UPDATE_STATISTICS option applies to statistics objects created for indexes, single-columns in query predicates, and statistics created with the CREATE STATISTICS statement. Essa opção também se aplica a estatísticas filtradas.This option also applies to filtered statistics.

Para saber mais sobre como controlar AUTO_UPDATE_STATISTICS, confira Controlando o comportamento das atualizações automáticas de estatísticas (AUTO_UPDATE_STATISTICS) no SQL Server.For more information about controlling AUTO_UPDATE_STATISTICS, see Controlling Autostat (AUTO_UPDATE_STATISTICS) behavior in SQL Server.

AUTO_UPDATE_STATISTICS_ASYNCAUTO_UPDATE_STATISTICS_ASYNC

A opção de atualização de estatísticas assíncrona, AUTO_UPDATE_STATISTICS_ASYNC, determina se o otimizador de consulta usa atualizações de estatísticas síncronas ou assíncronas.The asynchronous statistics update option, AUTO_UPDATE_STATISTICS_ASYNC, determines whether the Query Optimizer uses synchronous or asynchronous statistics updates. Por padrão, a opção de atualização de estatísticas assíncrona está desativada e o otimizador de consulta atualiza estatísticas de forma síncrona.By default, the asynchronous statistics update option is OFF, and the Query Optimizer updates statistics synchronously. A opção AUTO_UPDATE_STATISTICS_ASYNC se aplica a objetos de estatísticas criados para índices, colunas únicas em predicados de consulta e estatísticas criadas com a instrução CREATE STATISTICS .The AUTO_UPDATE_STATISTICS_ASYNC option applies to statistics objects created for indexes, single columns in query predicates, and statistics created with the CREATE STATISTICS statement.

Observação

Para definir a opção de atualização de estatísticas assíncrona no SQL Server Management StudioSQL Server Management Studio, na página Opções da janela Propriedades do Banco de Dados, as opções Atualizar Estatísticas Automaticamente e Atualizar Estatísticas Automaticamente de Forma Assíncrona devem ser definidas como Verdadeiro.To set the asynchronous statistics update option in SQL Server Management StudioSQL Server Management Studio, in the Options page of the Database Properties window, both Auto Update Statistics and Auto Update Statistics Asynchronously options need to be set to True.

As atualizações de estatísticas podem ser síncronas (o padrão) ou assíncronas.Statistics updates can be either synchronous (the default) or asynchronous. Com as atualizações de estatísticas síncronas, as consultas são sempre compiladas e executadas com estatísticas atualizadas. Quando as estatísticas estão desatualizadas, o otimizador de consulta aguarda estatísticas atualizadas antes de compilar e executar a consulta.With synchronous statistics updates, queries always compile and execute with up-to-date statistics; When statistics are out-of-date, the Query Optimizer waits for updated statistics before compiling and executing the query. Com as atualizações de estatísticas assíncronas, as consultas são compiladas com estatísticas existentes, mesmo que elas estejam desatualizas. O otimizador de consulta poderá escolher um plano de consulta com qualidade inferior se as estatísticas estiverem desatualizadas na compilação da consulta.With asynchronous statistics updates, queries compile with existing statistics even if the existing statistics are out-of-date; The Query Optimizer could choose a suboptimal query plan if statistics are out-of-date when the query compiles. As consultas compiladas após a conclusão das atualizações assíncronas serão beneficiadas por usarem estatísticas atualizadas.Queries that compile after the asynchronous updates have completed will benefit from using the updated statistics.

Considere o uso de estatísticas síncronas ao executar operações que alteram a distribuição de dados, como truncar uma tabela ou executar uma atualização em massa de uma porcentagem grande das linhas.Consider using synchronous statistics when you perform operations that change the distribution of data, such as truncating a table or performing a bulk update of a large percentage of the rows. Se você não atualizar as estatísticas depois de concluir a operação, o uso de estatísticas síncronas garantirá que as estatísticas sejam atualizadas antes de executar consultas nos dados alterados.If you do not update the statistics after completing the operation, using synchronous statistics will ensure statistics are up-to-date before executing queries on the changed data.

Considere o uso de estatísticas assíncronas para obter tempos de resposta de consulta mais previsíveis para os seguintes cenários:Consider using asynchronous statistics to achieve more predictable query response times for the following scenarios:

  • Seu aplicativo executa frequentemente a mesma consulta, consultas semelhantes ou planos de consulta em cache semelhantes.Your application frequently executes the same query, similar queries, or similar cached query plans. Os tempos de resposta de consulta podem ser mais previsíveis com atualizações de estatísticas assíncronas do que com atualizações de estatísticas síncronas, pois o otimizador de consulta pode executar consultas de entrada sem aguardar estatísticas atualizadas.Your query response times might be more predictable with asynchronous statistics updates than with synchronous statistics updates because the Query Optimizer can execute incoming queries without waiting for up-to-date statistics. Isso evita o atraso de algumas consultas e não de outras.This avoids delaying some queries and not others.

  • Seu aplicativo excedeu o tempo limite de solicitações do cliente pelo fato de uma ou mais consultas estarem aguardando a atualização de estatísticas.Your application has experienced client request time outs caused by one or more queries waiting for updated statistics. Em alguns casos, a espera por estatísticas síncronas pode gerar falhas em aplicativos com tempo limite restrito.In some cases, waiting for synchronous statistics could cause applications with aggressive time outs to fail.

INCREMENTALINCREMENTAL

Quando a opção INCREMENTAL de CREATE STATISTICS for ON, as estatísticas serão criadas de acordo com as estatísticas da partição.When INCREMENTAL option of CREATE STATISTICS is ON, the statistics created are per partition statistics. Quando estiver OFF, a árvore de estatísticas será ignorada e o SQL ServerSQL Server recomputará as estatísticas.When OFF, the statistics tree is dropped and SQL ServerSQL Server re-computes the statistics. O padrão é OFF.The default is OFF. Essa configuração substitui a propriedade INCREMENTAL de nível de banco de dados.This setting overrides the database level INCREMENTAL property. Para obter informações sobre como criar estatísticas incrementais, consulte CREATE STATISTICS (Transact-SQL).For more information about creating incremental statistics, see CREATE STATISTICS (Transact-SQL). Para obter mais informações sobre como criar estatísticas por partição automaticamente, consulte Propriedades de banco de dados (página Opções) e Opções ALTER DATABASE SET (Transact-SQL).For more information about creating per partition statistics automatically, see Database Properties (Options Page) and ALTER DATABASE SET Options (Transact-SQL).

Quando as novas partições são adicionados a uma tabela grande, as estatísticas devem ser atualizadas para incluir as novas partições.When new partitions are added to a large table, statistics should be updated to include the new partitions. No entanto, o tempo necessário para digitalizar a tabela inteira (opção FULLSCAN ou SAMPLE) podem ser muito longos.However the time required to scan the entire table (FULLSCAN or SAMPLE option) might be quite long. Além disso, digitalizar a tabela inteira não é necessário porque somente as estatísticas nas novas partições podem ser necessárias.Also, scanning the entire table isn't necessary because only the statistics on the new partitions might be needed. A opção incremental cria e armazena estatísticas por partição e, quando atualizada, somente atualiza estatísticas nessas partições que precisam de novas estatísticasThe incremental option creates and stores statistics on a per partition basis, and when updated, only refreshes statistics on those partitions that need new statistics

Se as estatísticas por partição não tiverem suporte, a opção será ignorada e um aviso será gerado.If per partition statistics are not supported the option is ignored and a warning is generated. As estatísticas incrementais não têm suporte para os seguintes tipos de estatísticas:Incremental stats are not supported for following statistics types:

  • Estatísticas criadas com os índices que não estejam alinhados por partição com a tabela base.Statistics created with indexes that are not partition-aligned with the base table.
  • Estatísticas criadas em bancos de dados secundários legíveis AlwaysOn.Statistics created on Always On readable secondary databases.
  • Estatísticas criadas em bancos de dados somente leitura.Statistics created on read-only databases.
  • Estatísticas criadas em índices filtrados.Statistics created on filtered indexes.
  • Estatísticas criadas em exibições.Statistics created on views.
  • Estatísticas criadas em tabelas internas.Statistics created on internal tables.
  • Estatísticas criadas com índices espaciais ou índices XML.Statistics created with spatial indexes or XML indexes.

Aplica-se a: do SQL Server 2014 (12.x)SQL Server 2014 (12.x) ao SQL Server 2017SQL Server 2017.Applies to: SQL Server 2014 (12.x)SQL Server 2014 (12.x) through SQL Server 2017SQL Server 2017.

Quando criar estatísticasWhen to create statistics

O otimizador de consulta já cria estatísticas das seguintes maneiras:The Query Optimizer already creates statistics in the following ways:

  1. O otimizador de consulta cria estatísticas para índices em tabelas ou exibições quando o índice é criado.The Query Optimizer creates statistics for indexes on tables or views when the index is created. Essas estatísticas são criadas nas colunas de chaves do índice.These statistics are created on the key columns of the index. Se o índice for um índice filtrado, o otimizador de consulta criará estatísticas filtradas no mesmo subconjunto de linhas especificado para o índice filtrado.If the index is a filtered index, the Query Optimizer creates filtered statistics on the same subset of rows specified for the filtered index. Para obter mais informações sobre índices filtrados, veja Criar índices filtrados e CREATE INDEX (Transact-SQL).For more information about filtered indexes, see Create Filtered Indexes and CREATE INDEX (Transact-SQL).

  2. O otimizador de consulta cria estatísticas para colunas únicas em predicados de consulta quando AUTO_CREATE_STATISTICS estiver ativada.The Query Optimizer creates statistics for single columns in query predicates when AUTO_CREATE_STATISTICS is on.

Somos todos ouvidos: Se você encontrar algo desatualizado ou incorreto neste artigo, como uma etapa ou um exemplo de código, informe-nos.We are listening: If you find something outdated or incorrect in this article, such as a step or a code example, please tell us. Você pode clicar no botão Esta página na seção Comentários na parte inferior desta página.You can click the This page button in the Feedback section at the bottom of this page. Lemos todos os itens de comentários sobre o SQL, normalmente no dia seguinte.We read every item of feedback about SQL, typically the next day. Obrigado.Thanks.

Para a maioria das consultas, esses dois métodos para criar estatísticas asseguram um plano de consulta de alta qualidade; em alguns casos, você pode aprimorar os planos de consulta criando estatísticas adicionais com a instrução CREATE STATISTICS .For most queries, these two methods for creating statistics ensure a high-quality query plan; in a few cases, you can improve query plans by creating additional statistics with the CREATE STATISTICS statement. Essas estatísticas adicionais podem capturar correlações estatísticas que o otimizador de consulta não considera ao criar estatísticas para índices ou colunas únicas.These additional statistics can capture statistical correlations that the Query Optimizer does not account for when it creates statistics for indexes or single columns. Seu aplicativo pode ter correlações estatísticas adicionais nos dados de tabela que, se calculadas em um objeto de estatísticas, pode permitir que o otimizador de consulta aprimore os planos de consulta.Your application might have additional statistical correlations in the table data that, if calculated into a statistics object, could enable the Query Optimizer to improve query plans. Por exemplo, estatísticas filtradas em um subconjunto de linhas de dados ou estatísticas multicolunas em colunas de predicado de consulta podem aprimorar o plano de consulta.For example, filtered statistics on a subset of data rows or multicolumn statistics on query predicate columns might improve the query plan.

Ao criar estatísticas com a instrução CREATE STATISTICS, recomendamos manter a opção AUTO_CREATE_STATISTICS ativada de forma que o otimizador de consulta continue criando estatísticas da coluna única rotineiramente para colunas de predicado de consulta.When creating statistics with the CREATE STATISTICS statement, we recommend keeping the AUTO_CREATE_STATISTICS option on so that the Query Optimizer continues to routinely create single-column statistics for query predicate columns. Para obter mais informações sobre predicados de consulta, veja Critério de pesquisa (Transact-SQL).For more information about query predicates, see Search Condition (Transact-SQL).

Considere a criação de estatísticas com a instrução CREATE STATISTICS quando alguma das seguintes opções se aplicar:Consider creating statistics with the CREATE STATISTICS statement when any of the following applies:

  • O Orientador de Otimização do Mecanismo de Banco de DadosDatabase Engine sugere a criação de estatísticas.The Mecanismo de Banco de DadosDatabase Engine Tuning Advisor suggests creating statistics.
  • O predicado de consulta contém várias colunas correlacionadas que ainda não estão no mesmo índice.The query predicate contains multiple correlated columns that are not already in the same index.
  • A consulta faz a seleção em um subconjunto de dados.The query selects from a subset of data.
  • Há estatísticas ausentes na consulta.The query has missing statistics.

O predicado de consulta contém várias colunas correlacionadasQuery Predicate contains multiple correlated columns

Quando um predicado de consulta contém várias colunas que têm relações e dependências entre colunas, as estatísticas nas várias colunas podem aprimorar o plano de consulta.When a query predicate contains multiple columns that have cross-column relationships and dependencies, statistics on the multiple columns might improve the query plan. As estatísticas em várias colunas contêm estatísticas de correlação entre colunas, chamadas densidades, que não estão disponíveis em estatísticas de coluna única.Statistics on multiple columns contain cross-column correlation statistics, called densities, that are not available in single-column statistics. As densidades podem aprimorar as estimativas de cardinalidade quando os resultados de consulta dependem de relações de dados entre várias colunas.Densities can improve cardinality estimates when query results depend on data relationships among multiple columns.

Se as colunas já estiverem no mesmo índice, o objeto de estatísticas multicolunas já existirá e não será necessário criá-lo manualmente.If the columns are already in the same index, the multicolumn statistics object already exists and it is not necessary to create it manually. Se as colunas ainda não estiverem no mesmo índice, você poderá criar estatísticas multicolunas criando um índice nas colunas ou usando a instrução CREATE STATISTICS.If the columns are not already in the same index, you can create multicolumn statistics by creating an index on the columns or by using the CREATE STATISTICS statement. A manutenção de um índice exige mais recursos do sistema do que a de um objeto de estatísticas.It requires more system resources to maintain an index than a statistics object. Se o aplicativo não exigir o índice multicolunas, você poderá economizar recursos do sistema criando o objeto de estatísticas sem criar o índice.If the application does not require the multicolumn index, you can economize on system resources by creating the statistics object without creating the index.

Ao criar estatísticas multicolunas, a ordem das colunas na definição do objeto de estatísticas afeta a efetividade de densidades para calcular estimativas de cardinalidade.When creating multicolumn statistics, the order of the columns in the statistics object definition affects the effectiveness of densities for making cardinality estimates. O objeto de estatísticas armazena densidades para cada prefixo de colunas de chave na definição do objeto.The statistics object stores densities for each prefix of key columns in the statistics object definition. Para obter mais informações sobre densidades, consulte a seção Densidade nesta página.For more information about densities, see Density section in this page.

Para criar densidades úteis para estimativas de cardinalidade, as colunas no predicado de consulta devem corresponder a um dos prefixos de colunas na definição do objeto de estatísticas.To create densities that are useful for cardinality estimates, the columns in the query predicate must match one of the prefixes of columns in the statistics object definition. O exemplo a seguir cria um objeto de estatísticas multicolunas nas colunas LastName, MiddleNamee FirstName.For example, the following creates a multicolumn statistics object on the columns LastName, MiddleName, and FirstName.

USE AdventureWorks2012;  
GO  
IF EXISTS (SELECT name FROM sys.stats  
    WHERE name = 'LastFirst'  
    AND object_ID = OBJECT_ID ('Person.Person'))  
DROP STATISTICS Person.Person.LastFirst;  
GO  
CREATE STATISTICS LastFirst ON Person.Person (LastName, MiddleName, FirstName);  
GO  

Neste exemplo, o objeto de estatísticas LastFirst apresenta densidades para os seguintes prefixos de coluna: (LastName), (LastName, MiddleName) e (LastName, MiddleName, FirstName).In this example, the statistics object LastFirst has densities for the following column prefixes: (LastName), (LastName, MiddleName), and (LastName, MiddleName, FirstName). A densidade não está disponível para (LastName, FirstName).The density is not available for (LastName, FirstName). Se a consulta usar LastName e FirstName sem usar MiddleName, a densidade não estará disponível para estimativas de cardinalidade.If the query uses LastName and FirstName without using MiddleName, the density is not available for cardinality estimates.

A consulta faz seleções em um subconjunto de dadosQuery Selects from a subset of data

Quando o otimizador de consulta cria estatísticas para colunas únicas e índices, as estatísticas são criadas para os valores em todas as linhas.When the Query Optimizer creates statistics for single columns and indexes, it creates the statistics for the values in all rows. Quando as consultas fazem seleções em um subconjunto de linhas e esse subconjunto tem uma distribuição de dados exclusiva, as estatísticas filtradas podem aprimorar os planos de consulta.When queries select from a subset of rows, and that subset of rows has a unique data distribution, filtered statistics can improve query plans. É possível criar estatísticas filtradas usando a instrução CREATE STATISTICS com a cláusula WHERE para definir a expressão de predicado de filtro.You can create filtered statistics by using the CREATE STATISTICS statement with the WHERE clause to define the filter predicate expression.

Por exemplo, usando AdventureWorks2012AdventureWorks2012, cada produto na tabela Production.Product pertence a uma das quatro categorias na tabela Production.ProductCategory: Bicicletas, Componentes, Roupas e Acessórios.For example, using AdventureWorks2012AdventureWorks2012, each product in the Production.Product table belongs to one of four categories in the Production.ProductCategory table: Bikes, Components, Clothing, and Accessories. Cada categoria possui uma distribuição de dados diferente para peso: as bicicletas pesam de 13,77 a 30, os componentes pesam de 2,12 a 1050,00 com alguns valores NULL, o peso de todas as roupas é NULL e o peso dos acessórios também é NULL.Each of the categories has a different data distribution for weight: bike weights range from 13.77 to 30.0, component weights range from 2.12 to 1050.00 with some NULL values, clothing weights are all NULL, and accessory weights are also NULL.

Usando Bicicletas como um exemplo, as estatísticas filtradas em todos os pesos de bicicleta fornecerão estatísticas mais precisas ao otimizador de consulta e podem melhorar a qualidade do plano de consulta comparadas com as estatísticas de tabela completa ou estatísticas inexistentes na coluna Peso.Using Bikes as an example, filtered statistics on all bike weights will provide more accurate statistics to the Query Optimizer and can improve the query plan quality compared with full-table statistics or nonexistent statistics on the Weight column. A coluna de peso das bicicletas é uma boa candidata para estatísticas filtradas, mas não necessariamente para um índice filtrado se o número de pesquisas de peso for relativamente pequeno.The bike weight column is a good candidate for filtered statistics but not necessarily a good candidate for a filtered index if the number of weight lookups is relatively small. O ganho de desempenho que um índice filtrado oferece às pesquisas pode não compensar os custos adicionais com a manutenção e o custo de armazenamento exigidos para adicionar um índice filtrado ao banco de dados.The performance gain for lookups that a filtered index provides might not outweigh the additional maintenance and storage cost for adding a filtered index to the database.

A instrução a seguir cria as estatísticas filtradas de BikeWeights em todas as subcategorias de Bicicletas.The following statement creates the BikeWeights filtered statistics on all of the subcategories for Bikes. A expressão de predicado filtrada define bicicletas enumerando todas as suas subcategorias com a comparação Production.ProductSubcategoryID IN (1,2,3).The filtered predicate expression defines bikes by enumerating all of the bike subcategories with the comparison Production.ProductSubcategoryID IN (1,2,3). O predicado não pode usar o nome de categoria Bicicletas porque ele está armazenado na tabela Production.ProductCategory e todas as colunas na expressão de filtro devem estar na mesma tabela.The predicate cannot use the Bikes category name because it is stored in the Production.ProductCategory table, and all columns in the filter expression must be in the same table.

USE AdventureWorks2012;
GO
IF EXISTS ( SELECT name FROM sys.stats
    WHERE name = 'BikeWeights'
    AND object_ID = OBJECT_ID ('Production.Product'))
DROP STATISTICS Production.Product.BikeWeights;
GO
CREATE STATISTICS BikeWeights
    ON Production.Product (Weight)
WHERE ProductSubcategoryID IN (1,2,3);
GO

O otimizador de consulta pode usar as estatísticas filtradas de BikeWeights para aprimorar o plano da consulta a seguir, que seleciona todas as bicicletas que pesam mais de 25.The Query Optimizer can use the BikeWeights filtered statistics to improve the query plan for the following query that selects all of the bikes that weigh more than 25.

SELECT P.Weight AS Weight, S.Name AS BikeName  
FROM Production.Product AS P  
    JOIN Production.ProductSubcategory AS S   
    ON P.ProductSubcategoryID = S.ProductSubcategoryID  
WHERE P.ProductSubcategoryID IN (1,2,3) AND P.Weight > 25  
ORDER BY P.Weight;  
GO  

A consulta identifica estatísticas ausentesQuery identifies missing statistics

Se um erro ou outro evento impedir que o otimizador de consulta crie estatísticas, o otimizador criará o plano de consulta sem usar estatísticas.If an error or other event prevents the Query Optimizer from creating statistics, the Query Optimizer creates the query plan without using statistics. O otimizador de consulta marca as estatísticas como ausentes e tenta gerar as estatísticas novamente na próxima execução da consulta.The Query Optimizer marks the statistics as missing and attempts to regenerate the statistics the next time the query is executed.

As estatísticas ausentes são indicadas como avisos (nome de tabela em texto vermelho) quando o plano de execução de uma consulta é exibido graficamente usando o SQL Server Management StudioSQL Server Management Studio.Missing statistics are indicated as warnings (table name in red text) when the execution plan of a query is graphically displayed using SQL Server Management StudioSQL Server Management Studio. Além disso, o monitoramento da classe de evento Missing Column Statistics usando o SQL Server ProfilerSQL Server Profiler indica quando há estatísticas ausentes.Additionally, monitoring the Missing Column Statistics event class by using SQL Server ProfilerSQL Server Profiler indicates when statistics are missing. Para obter mais informações, veja Categoria de evento de erros e de avisos (Mecanismo de Banco de Dados).For more information, see Errors and Warnings Event Category (Database Engine).

Se houver estatísticas ausentes, execute as seguintes etapas:If statistics are missing, perform the following steps:

Quando as estatísticas em um banco de dados somente leitura ou um instantâneo somente leitura estão ausentes ou obsoletas, o Mecanismo de Banco de DadosDatabase Engine cria e mantém estatísticas temporárias no tempdb.When statistics on a read-only database or read-only snapshot are missing or stale, the Mecanismo de Banco de DadosDatabase Engine creates and maintains temporary statistics in tempdb. Quando o Mecanismo de Banco de DadosDatabase Engine cria estatísticas temporárias, o nome das estatísticas é anexado com o sufixo _readonly_database_statistic para diferenciar as estatísticas temporárias de estatísticas permanentes.When the Mecanismo de Banco de DadosDatabase Engine creates temporary statistics, the statistics name is appended with the suffix _readonly_database_statistic to differentiate the temporary statistics from the permanent statistics. O sufixo _readonly_database_statistic fica reservado para estatísticas geradas pelo SQL ServerSQL Server.The suffix _readonly_database_statistic is reserved for statistics generated by SQL ServerSQL Server. É possível criar e reproduzir scripts para as estatísticas temporárias em um banco de dados de leitura-gravação.Scripts for the temporary statistics can be created and reproduced on a read-write database. Quando em script, o Management StudioManagement Studio altera o sufixo do nome das estatísticas de _readonly_database_statistic para _readonly_database_statistic_scripted.When scripted, Management StudioManagement Studio changes the suffix of the statistics name from _readonly_database_statistic to _readonly_database_statistic_scripted.

Somente o SQL ServerSQL Server pode criar e atualizar estatísticas temporárias.Only SQL ServerSQL Server can create and update temporary statistics. No entanto, você pode excluir estatísticas temporárias e monitorar as propriedades de estatísticas que usam as mesmas ferramentas que você utiliza para estatísticas permanentes:However, you can delete temporary statistics and monitor statistics properties using the same tools that you use for permanent statistics:

  • Exclua estatísticas temporárias usando a instrução DROP STATISTICS.Delete temporary statistics using the DROP STATISTICS statement.
  • Para monitorar as estatísticas, use as exibições de catálogo sys.stats e sys.stats_columns .Monitor statistics using the sys.stats and sys.stats_columns catalog views. sys_stats inclui a coluna, is_temporary para indicar quais estatísticas são permanentes e quais são temporárias.sys_stats includes the is_temporary column, to indicate which statistics are permanent and which are temporary.

Como as estatísticas temporárias são armazenadas em tempdb, uma reinicialização do serviço SQL ServerSQL Server faz com que todas as estatísticas temporárias desapareçam.Because temporary statistics are stored in tempdb, a restart of the SQL ServerSQL Server service causes all temporary statistics to disappear.

Quando atualizar estatísticasWhen to update statistics

O otimizador de consulta determina quando as estatísticas podem estar desatualizadas e as atualiza quando forem necessárias para um plano de consulta.The Query Optimizer determines when statistics might be out-of-date and then updates them when they are needed for a query plan. Em alguns casos, você pode aprimorar o plano de consulta e, portanto, o desempenho da consulta por meio da atualização mais frequente das estatísticas do que quando AUTO_UPDATE_STATISTICS está ativada.In some cases you can improve the query plan and therefore improve query performance by updating statistics more frequently than occur when AUTO_UPDATE_STATISTICS is on. Você pode atualizar estatísticas com a instrução UPDATE STATISTICS ou o procedimento armazenado sp_updatestats.You can update statistics with the UPDATE STATISTICS statement or the stored procedure sp_updatestats.

A atualização de estatísticas assegura que as consultas sejam compiladas com estatísticas atualizadas.Updating statistics ensures that queries compile with up-to-date statistics. Porém, a atualização de estatísticas faz com que as consultas sejam recompiladas.However, updating statistics causes queries to recompile. É recomendável não atualizar estatísticas com muita frequência porque existe uma compensação de desempenho entre o aprimoramento dos planos de consulta e o tempo necessário para recompilar consultas.We recommend not updating statistics too frequently because there is a performance tradeoff between improving query plans and the time it takes to recompile queries. As compensações específicas dependem do seu aplicativo.The specific tradeoffs depend on your application.

Quando atualizar estatísticas com UPDATE STATISTICS ou sp_updatestats, recomendamos manter a opção AUTO_UPDATE_STATISTICS ativada de modo que o otimizador de consulta continue a atualizar estatísticas periodicamente.When updating statistics with UPDATE STATISTICS or sp_updatestats, we recommend keeping AUTO_UPDATE_STATISTICS set to ON so that the Query Optimizer continues to routinely update statistics. Para obter mais informações sobre como atualizar estatísticas em uma coluna, um índice, uma tabela ou uma exibição indexada, veja UPDATE STATISTICS (Transact-SQL).For more information about how to update statistics on a column, an index, a table, or an indexed view, see UPDATE STATISTICS (Transact-SQL). Para obter informações sobre como atualizar estatísticas de todas as tabelas definidas pelo usuário e internas no banco de dados, veja o procedimento armazenado sp_updatestats (Transact-SQL).For information about how to update statistics for all user-defined and internal tables in the database, see the stored procedure sp_updatestats (Transact-SQL).

Para determinar quando as estatísticas foram atualizadas pela última vez, use as funções sys.dm_db_stats_properties ou STATS_DATE.To determine when statistics were last updated, use the sys.dm_db_stats_properties or STATS_DATE functions.

Considere a atualização de estatísticas nas seguintes condições:Consider updating statistics for the following conditions:

  • Os tempos de execução de consulta estão lentos.Query execution times are slow.
  • As operações de inserção ocorrem em colunas de chaves crescentes ou decrescentes.Insert operations occur on ascending or descending key columns.
  • Após operações de manutenção.After maintenance operations.

Os tempos de execução de consulta estão lentosQuery execution times are slow

Se os tempos de resposta de consultas estiverem lentos ou imprevisíveis, verifique se as consultas têm estatísticas atualizadas antes de executar as etapas adicionais de solução de problemas.If query response times are slow or unpredictable, ensure that queries have up-to-date statistics before performing additional troubleshooting steps.

As operações de inserção ocorrem em Colunas de Chaves crescentes ou decrescentesInsert operations occur on ascending or descending key columns

As estatísticas em Colunas de Chaves crescentes ou decrescentes, como colunas IDENTITY ou colunas de carimbo de data/hora em tempo real, podem exigir atualizações de estatísticas mais frequentes do que as executadas pelo otimizador de consulta.Statistics on ascending or descending key columns, such as IDENTITY or real-time timestamp columns, might require more frequent statistics updates than the Query Optimizer performs. As operações de inserção acrescentam novos valores às colunas crescentes ou decrescentes.Insert operations append new values to ascending or descending columns. O número de linhas adicionadas pode ser muito pequeno para disparar uma atualização de estatísticas.The number of rows added might be too small to trigger a statistics update. Se as estatísticas não estiverem atualizadas e as consultas fizerem seleções nas linhas adicionadas mais recentemente, as estatísticas atuais não terão estimativas de cardinalidade para obter esses novos valores.If statistics are not up-to-date and queries select from the most recently added rows, the current statistics will not have cardinality estimates for these new values. Isso pode resultar em estimativas de cardinalidade imprecisas e lentidão no desempenho de consulta.This can result in inaccurate cardinality estimates and slow query performance.

Por exemplo, uma consulta que faz seleções em ordens de venda com as datas mais recentes terá estimativas de cardinalidade imprecisas, se as estatísticas não forem atualizadas para incluir estimativas de cardinalidade dessas ordens de venda.For example, a query that selects from the most recent sales order dates will have inaccurate cardinality estimates if the statistics are not updated to include cardinality estimates for the most recent sales order dates.

Após operações de manutençãoAfter maintenance operations

Considere a atualização de estatísticas depois de executar procedimentos de manutenção que alteram a distribuição de dados, como truncar uma tabela ou executar uma inserção em massa de uma porcentagem grande das linhas.Consider updating statistics after performing maintenance procedures that change the distribution of data, such as truncating a table or performing a bulk insert of a large percentage of the rows. Isso pode evitar futuros atrasos no processamento de consultas enquanto elas aguardam atualizações de estatísticas automáticas.This can avoid future delays in query processing while queries wait for automatic statistics updates.

Operações como reconstrução, desfragmentação ou reorganização de um índice não alteram a distribuição de dados.Operations such as rebuilding, defragmenting, or reorganizing an index do not change the distribution of data. Portanto, não é necessário atualizar estatísticas depois de executar as operações ALTER INDEX REBUILD, DBCC DBREINDEX, DBCC INDEXDEFRAG ou ALTER INDEX REORGANIZE.Therefore, you do not need to update statistics after performing ALTER INDEX REBUILD, DBCC DBREINDEX, DBCC INDEXDEFRAG, or ALTER INDEX REORGANIZE operations. O otimizador de consulta atualiza estatísticas quando você reconstrói um índice em uma tabela ou exibição com ALTER INDEX REBUILD ou DBCC DBREINDEX; no entanto, essa atualização de estatísticas é um subproduto da recriação do índice.The Query Optimizer updates statistics when you rebuild an index on a table or view with ALTER INDEX REBUILD or DBCC DBREINDEX, however this statistics update is a byproduct of re-creating the index. O otimizador de consulta não atualiza estatísticas depois de operações DBCC INDEXDEFRAG ou ALTER INDEX REORGANIZE.The Query Optimizer does not update statistics after DBCC INDEXDEFRAG or ALTER INDEX REORGANIZE operations.

Dica

Começando com o SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP1 CU4, use a opção PERSIST_SAMPLE_PERCENT de CREATE STATISTICS (Transact-SQL) ou UPDATE STATISTICS (Transact-SQL) a fim de definir e reter uma porcentagem de amostragem específica para atualizações estatísticas subsequentes que não especificam explicitamente uma porcentagem de amostragem.Starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP1 CU4, use the PERSIST_SAMPLE_PERCENT option of CREATE STATISTICS (Transact-SQL) or UPDATE STATISTICS (Transact-SQL), to set and retain a specific sampling percentage for subsequent statistic updates that do not explicitly specify a sampling percentage.

Índice automático e gerenciamento de estatísticasAutomatic index and statistics management

Aproveite soluções como a Desfragmentação de índice adaptável para gerenciar automaticamente a desfragmentação de índice e as atualizações de estatísticas em um ou mais bancos de dados.Leverage solutions such as Adaptive Index Defrag to automatically manage index defragmentation and statistics updates for one or more databases. Este procedimento escolhe automaticamente se deve recompilar ou reorganizar um índice de acordo com seu nível de fragmentação, entre outros parâmetros, e atualizar as estatísticas com um limite linear.This procedure automatically chooses whether to rebuild or reorganize an index according to its fragmentation level, amongst other parameters, and update statistics with a linear threshold.

Consultas que usam estatísticas de modo eficienteQueries that use statistics effectively

Algumas implementações de consulta, como variáveis locais e expressões complexas no predicado de consulta, podem gerar planos de consulta de qualidade inferior.Certain query implementations, such as local variables and complex expressions in the query predicate, can lead to suboptimal query plans. O cumprimento das diretrizes de design de consulta para o uso eficiente de estatísticas pode ajudar a evitar esse problema.Following query design guidelines for using statistics effectively can help to avoid this. Para obter mais informações sobre predicados de consulta, veja Critério de pesquisa (Transact-SQL).For more information about query predicates, see Search Condition (Transact-SQL).

Você pode melhorar planos de consulta aplicando diretrizes de design de consulta que usam estatísticas de modo eficiente para aprimorar estimativas de cardinalidade para expressões, variáveis e funções usadas em predicados de consulta.You can improve query plans by applying query design guidelines that use statistics effectively to improve cardinality estimates for expressions, variables, and functions used in query predicates. Quando o otimizador de consulta não souber o valor de uma expressão, variável ou função, ele não saberá qual valor deve ser pesquisado no histograma e, portanto, não poderá recuperar a estimativa ideal de cardinalidade do histograma.When the Query Optimizer does not know the value of an expression, variable, or function, it does not know which value to lookup in the histogram and therefore cannot retrieve the best cardinality estimate from the histogram. Em vez disso, o otimizador de consulta baseia a estimativa de cardinalidade no número médio de linhas por valor distinto de todas as linhas de amostra no histograma.Instead, the Query Optimizer bases the cardinality estimate on the average number of rows per distinct value for all of the sampled rows in the histogram. Isso gera estimativas de cardinalidade de qualidade inferior e pode prejudicar o desempenho de consulta.This leads to suboptimal cardinality estimates and can hurt query performance. Para saber mais sobre histogramas, confira a seção histograma nessa página ou em sys.dm_db_stats_histogram.For more information about histograms, see histogram section in this page or sys.dm_db_stats_histogram.

As diretrizes a seguir descrevem como escrever consultas para melhorar planos de consulta por meio do aprimoramento das estimativas de cardinalidade.The following guidelines describe how to write queries to improve query plans by improving cardinality estimates.

Aprimorando estimativas de cardinalidade para expressõesImproving cardinality estimates for expressions

Para aprimorar as estimativas de cardinalidade para expressões, siga estas diretrizes:To improve cardinality estimates for expressions, follow these guidelines:

  • Sempre que possível, simplifique expressões com constantes.Whenever possible, simplify expressions with constants in them. O otimizador de consulta não avalia todas as funções e expressões que contêm constantes, antes de determinar as estimativas de cardinalidade.The Query Optimizer does not evaluate all functions and expressions containing constants prior to determining cardinality estimates. Por exemplo, simplifique a expressão ABS(-100) para 100.For example, simplify the expression ABS(-100) to 100.

  • Se a expressão usar muitas variáveis, considere a criação de uma coluna computada para a expressão e crie estatísticas ou um índice na coluna computada.If the expression uses multiple variables, consider creating a computed column for the expression and then create statistics or an index on the computed column. Por exemplo, o predicado de consulta WHERE PRICE + Tax > 100 poderá ter uma estimativa de cardinalidade melhor se você criar uma coluna computada para a expressão Price + Tax.For example, the query predicate WHERE PRICE + Tax > 100 might have a better cardinality estimate if you create a computed column for the expression Price + Tax.

Aprimorando estimativas de cardinalidade para variáveis e funçõesImproving cardinality estimates for variables and functions

Para melhorar as estimativas de cardinalidade para variáveis e funções, siga estas diretrizes:To improve the cardinality estimates for variables and functions, follow these guidelines:

  • Se o predicado de consulta usar uma variável local, considere reescrever a consulta para usar um parâmetro em vez de uma variável local.If the query predicate uses a local variable, consider rewriting the query to use a parameter instead of a local variable. O valor de uma variável local não é conhecido quando o otimizador de consulta cria o plano de execução de consulta.The value of a local variable is not known when the Query Optimizer creates the query execution plan. Quando uma consulta usa um parâmetro, o otimizador de consulta usa a estimativa de cardinalidade para o primeiro valor de parâmetro real transmitido ao procedimento armazenado.When a query uses a parameter, the Query Optimizer uses the cardinality estimate for the first actual parameter value that is passed to the stored procedure.

  • Considere o uso de uma tabela padrão ou uma tabela temporária para manter os resultados de funções com valor de tabela de várias instruções (mstvf).Consider using a standard table or temporary table to hold the results of multi-statement table-valued functions (mstvf). O otimizador de consulta não cria estatísticas para funções com valor de tabela de várias instruções.The Query Optimizer does not create statistics for multi-statement table-valued functions. Com essa abordagem, o otimizador de consulta pode criar estatísticas nas colunas de tabela e usá-las para criar um plano de consulta melhor.With this approach the Query Optimizer can create statistics on the table columns and use them to create a better query plan.

  • Considere o uso de uma tabela padrão ou uma tabela temporária como uma substituição para variáveis de tabela.Consider using a standard table or temporary table as a replacement for table variables. O otimizador de consulta não cria estatísticas para variáveis de tabela.The Query Optimizer does not create statistics for table variables. Com essa abordagem, o otimizador de consulta pode criar estatísticas nas colunas de tabela e usá-las para criar um plano de consulta melhor.With this approach the Query Optimizer can create statistics on the table columns and use them to create a better query plan. Há compensações ao optar pelo uso de uma tabela temporária ou de uma variável de tabela; as variáveis de tabela usadas em procedimentos armazenados causam menos recompilações do procedimento armazenado que as tabelas temporárias.There are tradeoffs in determining whether to use a temporary table or a table variable; Table variables used in stored procedures cause fewer recompilations of the stored procedure than temporary tables. Dependendo do aplicativo, o uso de uma tabela temporária em vez de uma variável de tabela pode não melhorar o desempenho.Depending on the application, using a temporary table instead of a table variable might not improve performance.

  • Se um procedimento armazenado contiver uma consulta que usa um parâmetro transmitido, evite alterar o valor de parâmetro no procedimento armazenado antes de usá-lo na consulta.If a stored procedure contains a query that uses a passed-in parameter, avoid changing the parameter value within the stored procedure before using it in the query. As estimativas de cardinalidade da consulta se baseiam no valor de parâmetro transmitido, não no valor atualizado.The cardinality estimates for the query are based on the passed-in parameter value and not the updated value. Para evitar alterar o valor do parâmetro, você pode reescrever a consulta para usar dois procedimentos armazenados.To avoid changing the parameter value, you can rewrite the query to use two stored procedures.

    Por exemplo, o procedimento armazenado Sales.GetRecentSales a seguir altera o valor do parâmetro @date quando @date é NULL.For example, the following stored procedure Sales.GetRecentSales changes the value of the parameter @date when @date is NULL.

    USE AdventureWorks2012;  
    GO  
    IF OBJECT_ID ( 'Sales.GetRecentSales', 'P') IS NOT NULL  
        DROP PROCEDURE Sales.GetRecentSales;  
    GO  
    CREATE PROCEDURE Sales.GetRecentSales (@date datetime)  
    AS BEGIN  
        IF @date IS NULL  
            SET @date = DATEADD(MONTH, -3, (SELECT MAX(ORDERDATE) FROM Sales.SalesOrderHeader))  
        SELECT * FROM Sales.SalesOrderHeader h, Sales.SalesOrderDetail d  
        WHERE h.SalesOrderID = d.SalesOrderID  
        AND h.OrderDate > @date  
    END  
    GO  
    

    Se a primeira chamada do procedimento armazenado Sales.GetRecentSales transmitir NULL para o parâmetro @date, o otimizador de consulta compilará o procedimento armazenado com a estimativa de cardinalidade para @date = NULL, embora o predicado de consulta não seja chamado com @date = NULL.If the first call to the stored procedure Sales.GetRecentSales passes a NULL for the @date parameter, the Query Optimizer will compile the stored procedure with the cardinality estimate for @date = NULL even though the query predicate is not called with @date = NULL. Essa estimativa de cardinalidade pode ser significativamente diferente do número de linhas no resultado de consulta real.This cardinality estimate might be significantly different than the number of rows in the actual query result. Como resultado, o otimizador de consulta pode escolher um plano de consulta de qualidade inferior.As a result, the Query Optimizer might choose a suboptimal query plan. Para evitar isso, você pode reescrever o procedimento armazenado em dois procedimentos da seguinte maneira:To help avoid this, you can rewrite the stored procedure into two procedures as follows:

    USE AdventureWorks2012;  
    GO  
    IF OBJECT_ID ( 'Sales.GetNullRecentSales', 'P') IS NOT NULL  
        DROP PROCEDURE Sales.GetNullRecentSales;  
    GO  
    CREATE PROCEDURE Sales.GetNullRecentSales (@date datetime)  
    AS BEGIN  
        IF @date is NULL  
            SET @date = DATEADD(MONTH, -3, (SELECT MAX(ORDERDATE) FROM Sales.SalesOrderHeader))  
        EXEC Sales.GetNonNullRecentSales @date;  
    END  
    GO  
    IF OBJECT_ID ( 'Sales.GetNonNullRecentSales', 'P') IS NOT NULL  
        DROP PROCEDURE Sales.GetNonNullRecentSales;  
    GO  
    CREATE PROCEDURE Sales.GetNonNullRecentSales (@date datetime)  
    AS BEGIN  
        SELECT * FROM Sales.SalesOrderHeader h, Sales.SalesOrderDetail d  
        WHERE h.SalesOrderID = d.SalesOrderID  
        AND h.OrderDate > @date  
    END  
    GO  
    

Aprimorando estimativas de cardinalidade com dicas de consultaImproving cardinality estimates with query hints

Para aprimorar estimativas de cardinalidade para variáveis locais, use as dicas de consulta OPTIMIZE FOR <value> ou OPTIMIZE FOR UNKNOWN com RECOMPILE.To improve cardinality estimates for local variables, you can use the OPTIMIZE FOR <value> or OPTIMIZE FOR UNKNOWN query hints with RECOMPILE. Para obter mais informações, veja Dicas de consulta (Transact-SQL).For more information, see Query Hints (Transact-SQL).

Para alguns aplicativos, a recompilação da consulta toda vez que ela é executada pode levar muito tempo.For some applications, recompiling the query each time it executes might take too much time. A dica de consulta OPTIMIZE FOR poderá ajudar, mesmo que você não use a opção RECOMPILE.The OPTIMIZE FOR query hint can help even if you don't use the RECOMPILE option. Por exemplo, você poderia adicionar uma opção OPTIMIZE FOR ao procedimento armazenado Sales.GetRecentSales para especificar uma data.For example, you could add an OPTIMIZE FOR option to the stored procedure Sales.GetRecentSales to specify a specific date. O exemplo a seguir adiciona a opção OPTIMIZE FOR ao procedimento Sales.GetRecentSales.The following example adds the OPTIMIZE FOR option to the Sales.GetRecentSales procedure.

USE AdventureWorks2012;  
GO  
IF OBJECT_ID ( 'Sales.GetRecentSales', 'P') IS NOT NULL  
    DROP PROCEDURE Sales.GetRecentSales;  
GO  
CREATE PROCEDURE Sales.GetRecentSales (@date datetime)  
AS BEGIN  
    IF @date is NULL  
        SET @date = DATEADD(MONTH, -3, (SELECT MAX(ORDERDATE) FROM Sales.SalesOrderHeader))  
    SELECT * FROM Sales.SalesOrderHeader h, Sales.SalesOrderDetail d  
    WHERE h.SalesOrderID = d.SalesOrderID  
    AND h.OrderDate > @date  
    OPTION ( OPTIMIZE FOR ( @date = '2004-05-01 00:00:00.000'))  
END;  
GO  

Aprimorando estimativas de cardinalidade com guias de planoImproving cardinality estimates with Plan Guides

Para alguns aplicativos, é possível que as diretrizes de design de consulta não se apliquem porque você não pode alterar a consulta ou porque o uso da dica de consulta RECOMPILE pode causar muitas recompilações.For some applications, query design guidelines might not apply because you cannot change the query or using the RECOMPILE query hint might be cause too many recompiles. Você pode usar guias de plano para especificar outras dicas, como USE PLAN, a fim de controlar o comportamento da consulta ao investigar alterações do aplicativo com o fornecedor do aplicativo.You can use plan guides to specify other hints, such as USE PLAN, to control the behavior of the query while investigating application changes with the application vendor. Para obter mais informações sobre guias de plano, consulte Plan Guides.For more information about plan guides, see Plan Guides.

Consulte TambémSee Also

CREATE STATISTICS (Transact-SQL) CREATE STATISTICS (Transact-SQL)
UPDATE STATISTICS (Transact-SQL) UPDATE STATISTICS (Transact-SQL)
sp_updatestats (Transact-SQL) sp_updatestats (Transact-SQL)
DBCC SHOW_STATISTICS (Transact-SQL) DBCC SHOW_STATISTICS (Transact-SQL)
Opções ALTER DATABASE SET (Transact-SQL) ALTER DATABASE SET Options (Transact-SQL)
DROP STATISTICS (Transact-SQL) DROP STATISTICS (Transact-SQL)
CREATE INDEX (Transact-SQL) CREATE INDEX (Transact-SQL)
ALTER INDEX (Transact-SQL) ALTER INDEX (Transact-SQL)
Criar índices filtrados Create Filtered Indexes
Controlando o comportamento das atualizações automáticas de estatísticas (AUTO_UPDATE_STATISTICS) no SQL Server Controlling Autostat (AUTO_UPDATE_STATISTICS) behavior in SQL Server
STATS_DATE (Transact-SQL) STATS_DATE (Transact-SQL)
sys.dm_db_stats_properties (Transact-SQL) sys.dm_db_stats_properties (Transact-SQL)
sys.dm_db_stats_histogram (Transact-SQL)sys.dm_db_stats_histogram (Transact-SQL)
sys.statssys.stats
sys.stats_columns (Transact-SQL) sys.stats_columns (Transact-SQL)
Desfragmentação de índice adaptávelAdaptive Index Defrag