Estatísticas de tabela no Azure SQL Data WarehouseTable statistics in Azure SQL Data Warehouse

Recomendações e exemplos para criar e atualizar as estatísticas de otimização de consulta em tabelas no SQL Data Warehouse do Azure.Recommendations and examples for creating and updating query-optimization statistics on tables in Azure SQL Data Warehouse.

Por que usar estatísticasWhy use statistics

Quanto mais o SQL Data Warehouse do Azure souber sobre seus dados, mais rápido ele poderá executar as consultas.The more Azure SQL Data Warehouse knows about your data, the faster it can execute queries against it. Depois de carregar dados no SQL Data Warehouse, coletar estatísticas sobre seus dados é uma das coisas mais importantes que você pode fazer para otimizar suas consultas.After loading data into SQL Data Warehouse, collecting statistics on your data is one of the most important things you can do to optimize your queries. O otimizador de consulta do SQL Data Warehouse é um otimizador baseado em custos.The SQL Data Warehouse query optimizer is a cost-based optimizer. Ele compara o custo de vários planos de consulta e escolhe o plano com o menor custo.It compares the cost of various query plans, and then chooses the plan with the lowest cost. Na maioria dos casos, ele escolhe o plano que executará o mais rápido.In most cases, it chooses the plan that will execute the fastest. Por exemplo, se o otimizador estimar que a data em que a consulta está filtrando retornará uma linha, ela escolherá um plano.For example, if the optimizer estimates that the date your query is filtering on will return one row it will choose one plan. Se ele estimar que a data selecionada retornará 1 milhão linhas, ela retornará um plano diferente.If it estimates that the selected date will return 1 million rows, it will return a different plan.

Criação automática de estatísticaAutomatic creation of statistic

Quando a opção de AUTO_CREATE_STATISTICS do banco de dados está ativada, SQL Data Warehouse analisa as consultas de usuário de entrada para obter as estatísticas ausentes.When the database AUTO_CREATE_STATISTICS option is on, SQL Data Warehouse analyzes incoming user queries for missing statistics. Se as estatísticas estiverem ausentes, o otimizador de consulta criará estatísticas em colunas individuais no predicado de consulta ou condição de junção para melhorar as estimativas de cardinalidade para o plano de consulta.If statistics are missing, the query optimizer creates statistics on individual columns in the query predicate or join condition to improve cardinality estimates for the query plan. Criação automática de estatísticas está atualmente ativada por padrão.Automatic creation of statistics is currently turned on by default.

Você pode verificar se o data warehouse tem AUTO_CREATE_STATISTICS configurado executando o seguinte comando:You can check if your data warehouse has AUTO_CREATE_STATISTICS configured by running the following command:

SELECT name, is_auto_create_stats_on
FROM sys.databases

Se o data warehouse não tiver AUTO_CREATE_STATISTICS configurado, recomendamos que você habilite essa propriedade executando o seguinte comando:If your data warehouse does not have AUTO_CREATE_STATISTICS configured, we recommend you enable this property by running the following command:

ALTER DATABASE <yourdatawarehousename>
SET AUTO_CREATE_STATISTICS ON

Essas instruções irão disparar a criação automática de estatísticas:These statements will trigger automatic creation of statistics:

  • SELECIONARSELECT
  • INSERT-SELECTINSERT-SELECT
  • CTASCTAS
  • UPDATEUPDATE
  • EXCLUIRDELETE
  • Explique quando contém uma junção ou se a presença de um predicado é detectadaEXPLAIN when containing a join or the presence of a predicate is detected

Observação

Criação automática de estatísticas não é criada em tabelas temporárias ou externas.Automatic creation of statistics are not created on temporary or external tables.

A criação automática de estatísticas é feita de forma síncrona para que você possa incorrer em um desempenho de consulta ligeiramente degradado se suas colunas estiverem com estatísticas ausentes.Automatic creation of statistics is done synchronously so you may incur slightly degraded query performance if your columns are missing statistics. O tempo para criar estatísticas para uma única coluna depende do tamanho da tabela.The time to create statistics for a single column depends on the size of the table. Para evitar degradação de desempenho mensurável, especialmente em benchmarking de desempenho, você deve garantir que as estatísticas tenham sido criadas primeiro executando a carga de trabalho de parâmetro de comparação antes de criar o perfil do sistema.To avoid measurable performance degradation, especially in performance benchmarking, you should ensure stats have been created first by executing the benchmark workload before profiling the system.

Observação

A criação de estatísticas será registrada em Sys. dm_pdw_exec_requests em um contexto de usuário diferente.The creation of stats will be logged in sys.dm_pdw_exec_requests under a different user context.

Quando são criadas estatísticas automáticas, terão o formato: WA_Sys<8 digit column id in Hex><8 digit table id in Hex>.When automatic statistics are created, they will take the form: WA_Sys<8 digit column id in Hex><8 digit table id in Hex>. Você pode exibir estatísticas que já foram criadas executando o comando DBCC SHOW_STATISTICS :You can view stats that have already been created by running the DBCC SHOW_STATISTICS command:

DBCC SHOW_STATISTICS (<table_name>, <target>)

O table_name é o nome da tabela que contém as estatísticas a serem exibidas.The table_name is the name of the table that contains the statistics to display. Não pode ser uma tabela externa.This cannot be an external table. O destino é o nome do índice de destino, estatísticas ou coluna para o qual exibir informações de estatísticas.The target is the name of the target index, statistics, or column for which to display statistics information.

Atualização de estatísticasUpdating statistics

Uma prática recomendada é atualizar as estatísticas em colunas de data por dia à medida que novas datas são adicionadas.One best practice is to update statistics on date columns each day as new dates are added. Sempre que há um carregamento de novas linhas no data warehouse, novas datas de carga ou datas de transação são adicionadas.Each time new rows are loaded into the data warehouse, new load dates or transaction dates are added. Isso altera a distribuição de dados e torna as estatísticas desatualizadas.These change the data distribution and make the statistics out of date. Por outro lado, as estatísticas em uma coluna de país/região em uma tabela de cliente talvez nunca precisem ser atualizadas, pois a distribuição de valores geralmente não é alterada.Conversely, statistics on a country/region column in a customer table might never need to be updated, because the distribution of values doesn’t generally change. Supondo que a distribuição seja constante entre os clientes, adicionar novas linhas à variação de tabela não alterará a distribuição dos dados.Assuming the distribution is constant between customers, adding new rows to the table variation isn't going to change the data distribution. No entanto, se seu data warehouse contiver apenas um país/região e você inserir dados de um novo país/região, resultando em dados de vários países/regiões que estão sendo armazenados, você precisará atualizar as estatísticas na coluna país/região.However, if your data warehouse only contains one country/region and you bring in data from a new country/region, resulting in data from multiple countries/regions being stored, then you need to update statistics on the country/region column.

O seguinte são recomendações atualizando estatísticas:The following are recommendations updating statistics:

Frequência de atualizações de estatísticasFrequency of stats updates Conservadora: diáriaConservative: Daily
Depois de carregar ou transformar os dadosAfter loading or transforming your data
AmostragemSampling Menos de 1.000.000.000 linhas, use amostragem padrão (20 por cento).Less than 1 billion rows, use default sampling (20 percent).
Com mais de 1.000.000.000 linhas, use a amostragem de dois por cento.With more than 1 billion rows, use sampling of two percent.

Uma das primeiras perguntas a serem feitas quando você estiver solucionando problemas em uma consulta é, "As estatísticas estão atualizadas?"One of the first questions to ask when you're troubleshooting a query is, "Are the statistics up to date?"

Essa questão não pode ser respondida pela idade dos dados.This question is not one that can be answered by the age of the data. Um objeto de estatísticas atualizado pode ser antigo se não houver nenhuma alteração importante nos dados subjacentes.An up-to-date statistics object might be old if there's been no material change to the underlying data. Quando o número de linhas mudar substancialmente, ou houver uma alteração material na distribuição de valores para uma coluna, então, significa que é hora de atualizar as estatísticas.When the number of rows has changed substantially, or there is a material change in the distribution of values for a column, then it's time to update statistics.

Não há nenhuma exibição de gerenciamento dinâmico para determinar se os dados dentro da tabela foram alterados desde a última atualização das estatísticas.There is no dynamic management view to determine if data within the table has changed since the last time statistics were updated. Conhecer a idade de suas estatísticas pode fornecer uma parte da imagem.Knowing the age of your statistics can provide you with part of the picture. Você pode usar a seguinte consulta para determinar a última vez que suas estatísticas foram atualizadas em cada tabela.You can use the following query to determine the last time your statistics were updated on each table.

Observação

Se houver uma alteração de material na distribuição de valores para uma coluna, você deverá atualizar as estatísticas independentemente da última vez em que foram atualizadas.If there is a material change in the distribution of values for a column, you should update statistics regardless of the last time they were updated.

SELECT
    sm.[name] AS [schema_name],
    tb.[name] AS [table_name],
    co.[name] AS [stats_column_name],
    st.[name] AS [stats_name],
    STATS_DATE(st.[object_id],st.[stats_id]) AS [stats_last_updated_date]
FROM
    sys.objects ob
    JOIN sys.stats st
        ON  ob.[object_id] = st.[object_id]
    JOIN sys.stats_columns sc
        ON  st.[stats_id] = sc.[stats_id]
        AND st.[object_id] = sc.[object_id]
    JOIN sys.columns co
        ON  sc.[column_id] = co.[column_id]
        AND sc.[object_id] = co.[object_id]
    JOIN sys.types  ty
        ON  co.[user_type_id] = ty.[user_type_id]
    JOIN sys.tables tb
        ON  co.[object_id] = tb.[object_id]
    JOIN sys.schemas sm
        ON  tb.[schema_id] = sm.[schema_id]
WHERE
    st.[user_created] = 1;

As colunas de data em um data warehouse, por exemplo, normalmente precisam de atualizações frequentes de estatísticas.Date columns in a data warehouse, for example, usually need frequent statistics updates. Sempre que há um carregamento de novas linhas no data warehouse, novas datas de carga ou datas de transação são adicionadas.Each time new rows are loaded into the data warehouse, new load dates or transaction dates are added. Isso altera a distribuição de dados e torna as estatísticas desatualizadas.These change the data distribution and make the statistics out of date. Por outro lado, as estatísticas de uma coluna de gênero em uma tabela de clientes talvez nunca precisem ser atualizadas.Conversely, statistics on a gender column in a customer table might never need to be updated. Supondo que a distribuição seja constante entre os clientes, adicionar novas linhas à variação de tabela não alterará a distribuição dos dados.Assuming the distribution is constant between customers, adding new rows to the table variation isn't going to change the data distribution. No entanto, se o seu data warehouse contiver apenas um gênero e um novo requisito resultar em gêneros múltiplos, então, será necessário atualizar estatísticas sobre a coluna de gênero.However, if your data warehouse contains only one gender and a new requirement results in multiple genders, then you need to update statistics on the gender column.

Para obter mais informações, consulte as diretrizes gerais para Estatísticas.For more information, see general guidance for Statistics.

Implementação do gerenciamento de estatísticasImplementing statistics management

Geralmente, convém estender os processos de carregamento de dados a fim de garantir que as estatísticas estejam atualizadas ao final do carregamento.It is often a good idea to extend your data-loading process to ensure that statistics are updated at the end of the load. É no carregamento de dados que as tabelas frequentemente mudam de tamanho e/ou distribuição de valores.The data load is when tables most frequently change their size and/or their distribution of values. Portanto, esse é um momento lógico para implementar alguns processos de gerenciamento.Therefore, this is a logical place to implement some management processes.

Os seguintes princípios orientadores são fornecidos para atualizar suas estatísticas durante o processo de carregamento:The following guiding principles are provided for updating your statistics during the load process:

  • Certifique-se de que cada tabela carregada tenha pelo menos um objeto de estatísticas atualizado.Ensure that each loaded table has at least one statistics object updated. Isso atualiza as informações do tamanho da tabela (contagem de linhas e contagem de páginas) como parte da atualização de estatísticas.This updates the table size (row count and page count) information as part of the statistics update.
  • Concentre-se em colunas que participam de cláusulas JOIN, GROUP BY, ORDER BY e DISTINCT.Focus on columns participating in JOIN, GROUP BY, ORDER BY, and DISTINCT clauses.
  • Considere uma atualização mais frequentes das colunas de "chave crescente", por exemplo, datas de transação, porque esses valores não serão incluídos no histograma de estatísticas.Consider updating "ascending key" columns such as transaction dates more frequently, because these values will not be included in the statistics histogram.
  • Considere atualizar as colunas de distribuição estática com menos frequência.Consider updating static distribution columns less frequently.
  • Lembre-se, cada objeto estatístico é atualizado em sequência.Remember, each statistic object is updated in sequence. Simplesmente implementar UPDATE STATISTICS <TABLE_NAME> nem sempre é ideal, especialmente para tabelas amplas com muitos objetos de estatística.Simply implementing UPDATE STATISTICS <TABLE_NAME> isn't always ideal, especially for wide tables with lots of statistics objects.

Para obter mais informações, consulte Estimativa de cardinalidade.For more information, see Cardinality Estimation.

Exemplos: criar estatísticasExamples: Create statistics

Estes exemplos mostram como usar várias opções para a criação de estatísticas.These examples show how to use various options for creating statistics. As opções usadas para cada coluna dependem das características dos dados e de como a coluna será usada em consultas.The options that you use for each column depend on the characteristics of your data and how the column will be used in queries.

Criar estatísticas de coluna única com opções padrãoCreate single-column statistics with default options

Para criar estatísticas em uma coluna, basta fornecer um nome para o objeto de estatísticas e o nome da coluna.To create statistics on a column, simply provide a name for the statistics object and the name of the column.

Esta sintaxe usa todas as opções padrão.This syntax uses all of the default options. Por padrão, o SQL Data Warehouse utiliza uma amostragem de 20% da tabela ao criar estatísticas.By default, SQL Data Warehouse samples 20 percent of the table when it creates statistics.

CREATE STATISTICS [statistics_name] ON [schema_name].[table_name]([column_name]);

Por exemplo:For example:

CREATE STATISTICS col1_stats ON dbo.table1 (col1);

Criar estatísticas de coluna única examinando cada linhaCreate single-column statistics by examining every row

A taxa de amostragem padrão de 20 por cento é suficiente para a maioria das situações.The default sampling rate of 20 percent is sufficient for most situations. No entanto, você pode ajustar essa taxa de amostragem.However, you can adjust the sampling rate.

Para usar toda a tabela como amostragem, use a seguinte sintaxe:To sample the full table, use this syntax:

CREATE STATISTICS [statistics_name] ON [schema_name].[table_name]([column_name]) WITH FULLSCAN;

Por exemplo:For example:

CREATE STATISTICS col1_stats ON dbo.table1 (col1) WITH FULLSCAN;

Criar estatísticas de coluna única, especificando o tamanho da amostraCreate single-column statistics by specifying the sample size

Como alternativa, você pode especificar o tamanho da amostra como uma porcentagem:Alternatively, you can specify the sample size as a percent:

CREATE STATISTICS col1_stats ON dbo.table1 (col1) WITH SAMPLE = 50 PERCENT;

Criar estatísticas de coluna única em apenas algumas das linhasCreate single-column statistics on only some of the rows

Também é possível criar estatísticas em uma parte das linhas na tabela.You can also create statistics on a portion of the rows in your table. Isso é chamado de estatística filtrada.This is called a filtered statistic.

Por exemplo, é possível usar estatísticas filtradas quando você planeja consultar uma partição específica de uma tabela particionada grande.For example, you can use filtered statistics when you plan to query a specific partition of a large partitioned table. Ao criar estatísticas apenas nos valores de partição, a precisão das estatísticas melhora e, portanto, o desempenho da consulta também.By creating statistics on only the partition values, the accuracy of the statistics will improve, and therefore improve query performance.

Este exemplo cria estatísticas em um intervalo de valores.This example creates statistics on a range of values. Os valores podem ser facilmente definidos para corresponder ao intervalo de valores em uma partição.The values can easily be defined to match the range of values in a partition.

CREATE STATISTICS stats_col1 ON table1(col1) WHERE col1 > '2000101' AND col1 < '20001231';

Observação

Para que o otimizador de consulta considere usar estatísticas filtradas ao escolher o plano de consulta distribuída, a consulta deve ser adequada à definição do objeto de estatísticas.For the query optimizer to consider using filtered statistics when it chooses the distributed query plan, the query must fit inside the definition of the statistics object. Usando o exemplo anterior, a cláusula WHERE da consulta precisa especificar valores col1 entre 2000101 e 20001231.Using the previous example, the query's WHERE clause needs to specify col1 values between 2000101 and 20001231.

Criar estatísticas de coluna única com todas as opçõesCreate single-column statistics with all the options

Também é possível combinar as opções juntas.You can also combine the options together. O exemplo a seguir cria um objeto estatístico filtrado com um tamanho de amostra personalizado:The following example creates a filtered statistics object with a custom sample size:

CREATE STATISTICS stats_col1 ON table1 (col1) WHERE col1 > '2000101' AND col1 < '20001231' WITH SAMPLE = 50 PERCENT;

Para obter a referência completa, consulte CREATE STATISTICS.For the full reference, see CREATE STATISTICS.

Criar estatísticas de várias colunasCreate multi-column statistics

Para criar um objeto estatístico de várias colunas, use os exemplos anteriores, mas especifique mais colunas.To create a multi-column statistics object, simply use the previous examples, but specify more columns.

Observação

O histograma, que é usado para estimar o número de linhas no resultado da consulta, está disponível apenas para a primeira coluna listada na definição do objeto estatístico.The histogram, which is used to estimate the number of rows in the query result, is only available for the first column listed in the statistics object definition.

Neste exemplo, o histograma está em product_category.In this example, the histogram is on product_category. As estatísticas entre colunas são calculadas em product_category e product_sub_category:Cross-column statistics are calculated on product_category and product_sub_category:

CREATE STATISTICS stats_2cols ON table1 (product_category, product_sub_category) WHERE product_category > '2000101' AND product_category < '20001231' WITH SAMPLE = 50 PERCENT;

Como há uma correlação entre a categoria do_produto e a sub_categoria do_produto, um objeto de estatística de colunas múltiplas poderá ser útil se essas colunas forem acessadas ao mesmo tempo.Because there is a correlation between product_category and product_sub_category, a multi-column statistics object can be useful if these columns are accessed at the same time.

Criar estatísticas em todas as coluna em uma tabelaCreate statistics on all columns in a table

É uma maneira de criar estatísticas é emitir comandos CREATE STATISTICS depois de criar a tabela:One way to create statistics is to issue CREATE STATISTICS commands after creating the table:

CREATE TABLE dbo.table1
(
   col1 int
,  col2 int
,  col3 int
)
WITH
  (
    CLUSTERED COLUMNSTORE INDEX
  )
;

CREATE STATISTICS stats_col1 on dbo.table1 (col1);
CREATE STATISTICS stats_col2 on dbo.table2 (col2);
CREATE STATISTICS stats_col3 on dbo.table3 (col3);

Use um procedimento armazenado para criar estatísticas em todas as colunas em um banco de dadosUse a stored procedure to create statistics on all columns in a database

O SQL Data Warehouse não tem um procedimento armazenado no sistema equivalente ao sp_create_stats no SQL Server.SQL Data Warehouse does not have a system stored procedure equivalent to sp_create_stats in SQL Server. Esse procedimento armazenado cria um objeto de estatísticas de coluna única em todas as colunas do banco de dados que ainda não tenham estatísticas.This stored procedure creates a single column statistics object on every column of the database that doesn't already have statistics.

O exemplo a seguir ajudará você a começar o projeto do banco de dados.The following example will help you get started with your database design. Fique à vontade para adaptá-lo às suas necessidades:Feel free to adapt it to your needs:

CREATE PROCEDURE    [dbo].[prc_sqldw_create_stats]
(   @create_type    tinyint -- 1 default 2 Fullscan 3 Sample
,   @sample_pct     tinyint
)
AS

IF @create_type IS NULL
BEGIN
    SET @create_type = 1;
END;

IF @create_type NOT IN (1,2,3)
BEGIN
    THROW 151000,'Invalid value for @stats_type parameter. Valid range 1 (default), 2 (fullscan) or 3 (sample).',1;
END;

IF @sample_pct IS NULL
BEGIN;
    SET @sample_pct = 20;
END;

IF OBJECT_ID('tempdb..#stats_ddl') IS NOT NULL
BEGIN;
    DROP TABLE #stats_ddl;
END;

CREATE TABLE #stats_ddl
WITH    (   DISTRIBUTION    = HASH([seq_nmbr])
        ,   LOCATION        = USER_DB
        )
AS
WITH T
AS
(
SELECT      t.[name]                        AS [table_name]
,           s.[name]                        AS [table_schema_name]
,           c.[name]                        AS [column_name]
,           c.[column_id]                   AS [column_id]
,           t.[object_id]                   AS [object_id]
,           ROW_NUMBER()
            OVER(ORDER BY (SELECT NULL))    AS [seq_nmbr]
FROM        sys.[tables] t
JOIN        sys.[schemas] s         ON  t.[schema_id]       = s.[schema_id]
JOIN        sys.[columns] c         ON  t.[object_id]       = c.[object_id]
LEFT JOIN   sys.[stats_columns] l   ON  l.[object_id]       = c.[object_id]
                                    AND l.[column_id]       = c.[column_id]
                                    AND l.[stats_column_id] = 1
LEFT JOIN    sys.[external_tables] e    ON    e.[object_id]        = t.[object_id]
WHERE       l.[object_id] IS NULL
AND            e.[object_id] IS NULL -- not an external table
)
SELECT  [table_schema_name]
,       [table_name]
,       [column_name]
,       [column_id]
,       [object_id]
,       [seq_nmbr]
,       CASE @create_type
        WHEN 1
        THEN    CAST('CREATE STATISTICS '+QUOTENAME('stat_'+table_schema_name+ '_' + table_name + '_'+column_name)+' ON '+QUOTENAME(table_schema_name)+'.'+QUOTENAME(table_name)+'('+QUOTENAME(column_name)+')' AS VARCHAR(8000))
        WHEN 2
        THEN    CAST('CREATE STATISTICS '+QUOTENAME('stat_'+table_schema_name+ '_' + table_name + '_'+column_name)+' ON '+QUOTENAME(table_schema_name)+'.'+QUOTENAME(table_name)+'('+QUOTENAME(column_name)+') WITH FULLSCAN' AS VARCHAR(8000))
        WHEN 3
        THEN    CAST('CREATE STATISTICS '+QUOTENAME('stat_'+table_schema_name+ '_' + table_name + '_'+column_name)+' ON '+QUOTENAME(table_schema_name)+'.'+QUOTENAME(table_name)+'('+QUOTENAME(column_name)+') WITH SAMPLE '+CONVERT(varchar(4),@sample_pct)+' PERCENT' AS VARCHAR(8000))
        END AS create_stat_ddl
FROM T
;

DECLARE @i INT              = 1
,       @t INT              = (SELECT COUNT(*) FROM #stats_ddl)
,       @s NVARCHAR(4000)   = N''
;

WHILE @i <= @t
BEGIN
    SET @s=(SELECT create_stat_ddl FROM #stats_ddl WHERE seq_nmbr = @i);

    PRINT @s
    EXEC sp_executesql @s
    SET @i+=1;
END

DROP TABLE #stats_ddl;

Para criar estatísticas em todas as colunas na tabela usando os padrões, execute o procedimento armazenado.To create statistics on all columns in the table using the defaults, execute the stored procedure.

EXEC [dbo].[prc_sqldw_create_stats] 1, NULL;

Para criar estatísticas em todas as colunas da tabela usando uma verificação completa, chame este procedimento:To create statistics on all columns in the table using a fullscan, call this procedure:

EXEC [dbo].[prc_sqldw_create_stats] 2, NULL;

Para criar estatísticas de amostra em todas as colunas da tabela, insira 3 e o percentual da amostra.To create sampled statistics on all columns in the table, enter 3, and the sample percent. Esse procedimento usa uma taxa de amostra de 20%.This procedures uses a 20 percent sample rate.

EXEC [dbo].[prc_sqldw_create_stats] 3, 20;

Para criar estatísticas de amostra em todas as colunasTo create sampled statistics on all columns

Exemplos: atualizar as estatísticasExamples: Update statistics

Para atualizar as estatísticas, você pode:To update statistics, you can:

  • Atualizar um objeto de estatísticas.Update one statistics object. Especifique o nome do objeto de estatísticas que você deseja atualizar.Specify the name of the statistics object you want to update.
  • Atualizar todos os objetos de estatísticas em uma tabela.Update all statistics objects on a table. Especifique o nome da tabela em vez de um objeto de estatísticas específico.Specify the name of the table instead of one specific statistics object.

Atualizar um objeto de estatísticas específicoUpdate one specific statistics object

Use a sintaxe a seguir para atualizar um objeto de estatísticas específico:Use the following syntax to update a specific statistics object:

UPDATE STATISTICS [schema_name].[table_name]([stat_name]);

Por exemplo:For example:

UPDATE STATISTICS [dbo].[table1] ([stats_col1]);

Ao atualizar objetos de estatísticas específicos, você pode minimizar o tempo e os recursos necessários para o gerenciamento de estatísticas.By updating specific statistics objects, you can minimize the time and resources required to manage statistics. Isso requer algum planejamento para escolher os melhores objetos de estatísticas para atualizar.This requires some thought to choose the best statistics objects to update.

Atualizar todas as estatísticas em uma tabelaUpdate all statistics on a table

Um método simples para atualizar todos os objetos de estatísticas em uma tabela é:A simple method for updating all the statistics objects on a table is:

UPDATE STATISTICS [schema_name].[table_name];

Por exemplo:For example:

UPDATE STATISTICS dbo.table1;

A instrução UPDATE STATISTICs é fácil de usar.The UPDATE STATISTICS statement is easy to use. Lembre-se de que isso atualizará todas as estatísticas na tabela e, portanto, poderá executar mais trabalho do que o necessário.Just remember that it updates all statistics on the table, and therefore might perform more work than is necessary. Se o desempenho não for um problema, essa é a maneira mais fácil e completa de garantir que as estatísticas estejam atualizadas.If performance is not an issue, this is the easiest and most complete way to guarantee that statistics are up to date.

Observação

Ao atualizar todas as estatísticas em uma tabela, o SQL Data Warehouse realiza um exame para coletar amostras da tabela para cada objeto de estatística.When updating all statistics on a table, SQL Data Warehouse does a scan to sample the table for each statistics object. Se a tabela for grande e tiver muitas colunas e muitas estatísticas, talvez seja mais eficiente atualizar estatísticas individuais com base na necessidade.If the table is large and has many columns and many statistics, it might be more efficient to update individual statistics based on need.

Para ver uma implementação de um procedimento UPDATE STATISTICS, consulte Tabelas Temporárias.For an implementation of an UPDATE STATISTICS procedure, see Temporary Tables. O método de implementação é ligeiramente diferente do procedimento anterior CREATE STATISTICS, mas o resultado é o mesmo.The implementation method is slightly different from the preceding CREATE STATISTICS procedure, but the result is the same.

Para ver a sintaxe completa, consulte Atualizar estatísticas.For the full syntax, see Update Statistics.

Metadados de estatísticasStatistics metadata

Há várias exibições e funções do sistema que podem ser utilizadas para localizar informações sobre estatísticas.There are several system views and functions that you can use to find information about statistics. Por exemplo, você pode ver se um objeto de estatísticas está desatualizado usando a função stats-date para ver quando as estatísticas foram criadas ou atualizadas pela última vez.For example, you can see if a statistics object might be out of date by using the stats-date function to see when statistics were last created or updated.

Exibições de catálogo para as estatísticasCatalog views for statistics

Essas exibições do sistema fornecem informações sobre estatísticas:These system views provide information about statistics:

Exibição do catálogoCatalog view DESCRIÇÃODescription
sys.columnssys.columns Uma linha para cada coluna.One row for each column.
sys.objectssys.objects Uma linha para cada objeto no banco de dados.One row for each object in the database.
sys.schemassys.schemas Uma linha para cada esquema no banco de dados.One row for each schema in the database.
sys.statssys.stats Uma linha para cada objeto de estatísticas.One row for each statistics object.
sys.stats_columnssys.stats_columns Uma linha para cada coluna no objeto de estatísticas.One row for each column in the statistics object. Conecta novamente a sys.columns.Links back to sys.columns.
sys.tablessys.tables Uma linha para cada tabela (inclui tabelas externas).One row for each table (includes external tables).
sys.table_typessys.table_types Uma linha para cada tipo de dados.One row for each data type.

Funções de sistema para estatísticasSystem functions for statistics

Essas funções de sistema são úteis para trabalhar com estatísticas:These system functions are useful for working with statistics:

Função do sistemaSystem function DESCRIÇÃODescription
STATS_DATESTATS_DATE Data da última atualização do objeto de estatísticas.Date the statistics object was last updated.
DBCC SHOW_STATISTICSDBCC SHOW_STATISTICS Nível de resumo e informações detalhadas sobre a distribuição de valores conforme entendido pelo objeto de estatísticas.Summary level and detailed information about the distribution of values as understood by the statistics object.

Combinar colunas de estatísticas e funções em uma exibiçãoCombine statistics columns and functions into one view

Essa exibição une as colunas relacionadas às estatísticas e os resultados da função STATS_DATE() em conjunto.This view brings columns that relate to statistics and results from the STATS_DATE() function together.

CREATE VIEW dbo.vstats_columns
AS
SELECT
        sm.[name]                           AS [schema_name]
,       tb.[name]                           AS [table_name]
,       st.[name]                           AS [stats_name]
,       st.[filter_definition]              AS [stats_filter_definition]
,       st.[has_filter]                     AS [stats_is_filtered]
,       STATS_DATE(st.[object_id],st.[stats_id])
                                            AS [stats_last_updated_date]
,       co.[name]                           AS [stats_column_name]
,       ty.[name]                           AS [column_type]
,       co.[max_length]                     AS [column_max_length]
,       co.[precision]                      AS [column_precision]
,       co.[scale]                          AS [column_scale]
,       co.[is_nullable]                    AS [column_is_nullable]
,       co.[collation_name]                 AS [column_collation_name]
,       QUOTENAME(sm.[name])+'.'+QUOTENAME(tb.[name])
                                            AS two_part_name
,       QUOTENAME(DB_NAME())+'.'+QUOTENAME(sm.[name])+'.'+QUOTENAME(tb.[name])
                                            AS three_part_name
FROM    sys.objects                         AS ob
JOIN    sys.stats           AS st ON    ob.[object_id]      = st.[object_id]
JOIN    sys.stats_columns   AS sc ON    st.[stats_id]       = sc.[stats_id]
                            AND         st.[object_id]      = sc.[object_id]
JOIN    sys.columns         AS co ON    sc.[column_id]      = co.[column_id]
                            AND         sc.[object_id]      = co.[object_id]
JOIN    sys.types           AS ty ON    co.[user_type_id]   = ty.[user_type_id]
JOIN    sys.tables          AS tb ON  co.[object_id]        = tb.[object_id]
JOIN    sys.schemas         AS sm ON  tb.[schema_id]        = sm.[schema_id]
WHERE   1=1
AND     st.[user_created] = 1
;

Exemplos de DBCC SHOW_STATISTICS()DBCC SHOW_STATISTICS() examples

DBCC SHOW_STATISTICS() mostra os dados contidos em um objeto de estatísticas.DBCC SHOW_STATISTICS() shows the data held within a statistics object. Esses dados estão divididos em três partes:This data comes in three parts:

  • CabeçalhoHeader
  • Vetor de densidadeDensity vector
  • HistogramaHistogram

Os metadados de cabeçalho sobre as estatísticas.The header metadata about the statistics. O histograma exibe a distribuição de valores na primeira coluna de chave do objeto de estatísticas.The histogram displays the distribution of values in the first key column of the statistics object. O vetor de densidade mede a correlação entre colunas.The density vector measures cross-column correlation. O SQL Data Warehouse calcula estimativas de cardinalidade com qualquer um dos dados no objeto de estatística.SQL Data Warehouse computes cardinality estimates with any of the data in the statistics object.

Mostrar cabeçalho, densidade e histogramaShow header, density, and histogram

Este exemplo simples mostra as três partes de um objeto de estatísticas:This simple example shows all three parts of a statistics object:

DBCC SHOW_STATISTICS([<schema_name>.<table_name>],<stats_name>)

Por exemplo:For example:

DBCC SHOW_STATISTICS (dbo.table1, stats_col1);

Mostrar uma ou mais partes de DBCC SHOW_STATISTICS()Show one or more parts of DBCC SHOW_STATISTICS()

Se você estiver interessado apenas em visualizar partes específicas, use a cláusula WITH e especifique quais partes deseja ver:If you're only interested in viewing specific parts, use the WITH clause and specify which parts you want to see:

DBCC SHOW_STATISTICS([<schema_name>.<table_name>],<stats_name>) WITH stat_header, histogram, density_vector

Por exemplo:For example:

DBCC SHOW_STATISTICS (dbo.table1, stats_col1) WITH histogram, density_vector

Diferenças do DBCC SHOW_STATISTICS()DBCC SHOW_STATISTICS() differences

DBCC SHOW_STATISTICS() é implementado mais estritamente no SQL Data Warehouse comparado ao SQL Server:DBCC SHOW_STATISTICS() is more strictly implemented in SQL Data Warehouse compared to SQL Server:

  • Não há suporte para recursos não documentados.Undocumented features are not supported.
  • Não é possível usar Stats_stream.Cannot use Stats_stream.
  • Não é possível unir resultados para subconjuntos específicos de dados estatísticos.Cannot join results for specific subsets of statistics data. Por exemplo, STAT_HEADER INGRESSAr DENSITY_VECTOR.For example, STAT_HEADER JOIN DENSITY_VECTOR.
  • NO_INFOMSGS não pode ser definido para a supressão de mensagem.NO_INFOMSGS cannot be set for message suppression.
  • Não é possível usar colchetes em nomes de estatísticas.Square brackets around statistics names cannot be used.
  • Não é possível usar nomes de coluna para identificar objetos de estatísticas.Cannot use column names to identify statistics objects.
  • Não há suporte para o erro personalizado 2767.Custom error 2767 is not supported.

Próximas etapasNext steps

Para melhorar ainda mais o desempenho da consulta, veja Monitorar sua carga de trabalhoFor further improve query performance, see Monitor your workload