Compartilhar via


Criar e atualizar estatísticas de tabela no pool de SQL dedicado

Este artigo fornece recomendações e exemplos para criar a atualizar as estatísticas de otimização de consulta em tabelas no pool de SQL dedicado.

Por que usar estatísticas

Quanto mais o pool de SQL dedicado souber sobre seus dados, mais rápido ele poderá executar as consultas neles. Depois de carregar dados em um pool de SQL dedicado, uma das ações mais importantes que você pode realizar para otimizar a consulta é coletar estatísticas sobre seus dados.

O otimizador de consulta do pool de SQL dedicado é um otimizador baseado em custos. Ele compara o custo de vários planos de consulta e, em seguida, escolhe o plano com o menor custo. Na maioria dos casos, ele escolhe o plano que será executado mais rapidamente.

Por exemplo, o otimizador seleciona um determinado plano se estima que a data em que sua consulta filtra retornará uma linha. Se o otimizador estimar que a data selecionada retornará um milhão de linhas, ele escolhe um plano diferente.

Criação automática de estatísticas

Quando a opção AUTO_CREATE_STATISTICS do banco de dados está ativada, o pool de SQL dedicado analisa as consultas de usuário de entrada para ver se há estatísticas ausentes.

Se faltarem estatísticas, o otimizador de consulta cria estatísticas em colunas individuais no predicado de consulta ou na condição de junção para melhorar as estimativas da cardinalidade para o plano de consulta.

Observação

Criação automática de estatísticas está atualmente ativada por padrão.

Você pode verificar se seu pool de SQL dedicado tem a opção AUTO_CREATE_STATISTICS configurada executando o seguinte comando T-SQL:

SELECT name, is_auto_create_stats_on
FROM sys.databases

Caso seu pool de SQL dedicado não tenha a opção AUTO_CREATE_STATISTICS configurada, é recomendável habilitar essa propriedade executando o seguinte comando. Substitua <your-datawarehouse-name> pelo nome do pool de SQL dedicado.

ALTER DATABASE <your-datawarehouse-name>
SET AUTO_CREATE_STATISTICS ON

Essas instruções disparam a criação automática de estatísticas:

  • SELECT
  • INSERT... SELECT
  • CREATE TABLE AS SELECT (CTAS)
  • UPDATE
  • DELETE
  • EXPLAIN quando houver uma junção ou a presença de um predicado for detectada

Observação

A criação automática de estatísticas não é executada em tabelas temporárias ou externas.

A criação automática de estatísticas é feita de forma síncrona. Portanto, você pode ter um desempenho de consulta ligeiramente degradado se suas colunas estiverem faltando estatísticas. O tempo para criar estatísticas para uma única coluna depende do tamanho da tabela.

Para evitar a degradação mensurável do desempenho, verifique se as estatísticas foram criadas primeiro executando a carga de trabalho de parâmetros de comparação antes de criar um perfil do sistema.

Observação

A criação de estatísticas é registrada em sys.dm_pdw_exec_requests em um contexto de usuário diferente.

Quando as estatísticas automáticas são criadas, elas assumem o formato: _WA_Sys_<8 digit column id in Hex>_<8 digit table id in Hex>. Você pode exibir as estatísticas que já foram criadas ao executar o comando DBCC SHOW_STATISTICS:

DBCC SHOW_STATISTICS (<table_name>, <target>)

O table_name é o nome da tabela que contém as estatísticas a serem exibidas. Essa tabela não pode ser externa. O destino é o nome do índice, as estatísticas ou a coluna de destino cujas informações de estatísticas serão exibidas.

Atualizar estatísticas

Uma prática recomendada é atualizar as estatísticas em colunas de data por dia à medida que novas datas são adicionadas. Sempre que há um carregamento de novas linhas no pool de SQL dedicado, novas datas de carga ou de transação são adicionadas. Essas adições alteram a distribuição de dados e torna as estatísticas desatualizadas.

As estatísticas em uma coluna de país/região em uma tabela de cliente talvez nunca tenham que ser atualizadas, já que a distribuição de valores geralmente não é alterada. 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.

Porém, se o seu pool de SQL dedicado contiver apenas um país/região e você trouxer dados de um novo país/região, resultando no armazenamento dos dados de vários países/regiões, será necessário atualizar as estatísticas na coluna do país/região.

A seguir, recomendações para a atualização de estatísticas:

Atributo de estatísticas Recomendação
Frequência de atualizações de estatísticas Conservadora: diariamente
Após carregar ou transformar seus dados
Amostragem Menos de 1 bilhão de linhas, usar a amostragem padrão (20%).
Com mais de 1 bilhão de linhas, use a amostragem de 2%.

Uma das primeiras perguntas a serem feitas quando você estiver solucionando problemas em uma consulta é, “As estatísticas estão atualizadas?”

Essa pergunta não pode ser respondida pela idade dos dados. Um objeto de estatísticas atualizado pode ser antigo se não houver nenhuma alteração importante nos dados subjacentes. 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.

Não há nenhuma exibição de gerenciamento dinâmico para determinar se os dados da tabela foram alterados desde a última vez em que as estatísticas foram atualizadas. As duas consultas a seguir podem ajudar você a determinar se as suas estatísticas estão obsoletas.

  • Consulta 1: descubra a diferença entre a contagem de linhas das estatísticas (stats_row_count) e a contagem real de linhas (actual_row_count).

    select 
    objIdsWithStats.[object_id], 
    actualRowCounts.[schema], 
    actualRowCounts.logical_table_name, 
    statsRowCounts.stats_row_count, 
    actualRowCounts.actual_row_count,
    row_count_difference = CASE
        WHEN actualRowCounts.actual_row_count >= statsRowCounts.stats_row_count THEN actualRowCounts.actual_row_count - statsRowCounts.stats_row_count
        ELSE statsRowCounts.stats_row_count - actualRowCounts.actual_row_count
    END,
    percent_deviation_from_actual = CASE
        WHEN actualRowCounts.actual_row_count = 0 THEN statsRowCounts.stats_row_count
        WHEN statsRowCounts.stats_row_count = 0 THEN actualRowCounts.actual_row_count
        WHEN actualRowCounts.actual_row_count >= statsRowCounts.stats_row_count THEN CONVERT(NUMERIC(18, 0), CONVERT(NUMERIC(18, 2), (actualRowCounts.actual_row_count - statsRowCounts.stats_row_count)) / CONVERT(NUMERIC(18, 2), actualRowCounts.actual_row_count) * 100)
        ELSE CONVERT(NUMERIC(18, 0), CONVERT(NUMERIC(18, 2), (statsRowCounts.stats_row_count - actualRowCounts.actual_row_count)) / CONVERT(NUMERIC(18, 2), actualRowCounts.actual_row_count) * 100)
    END
    from
    (
        select distinct object_id from sys.stats where stats_id > 1
    ) objIdsWithStats
    left join
    (
        select object_id, sum(rows) as stats_row_count from sys.partitions group by object_id
    ) statsRowCounts
    on objIdsWithStats.object_id = statsRowCounts.object_id 
    left join
    (
        SELECT sm.name [schema] ,
            tb.name logical_table_name ,
            tb.object_id object_id ,
            SUM(rg.row_count) actual_row_count
        FROM sys.schemas sm
             INNER JOIN sys.tables tb ON sm.schema_id = tb.schema_id
             INNER JOIN sys.pdw_table_mappings mp ON tb.object_id = mp.object_id
             INNER JOIN sys.pdw_nodes_tables nt ON nt.name = mp.physical_name
             INNER JOIN sys.dm_pdw_nodes_db_partition_stats rg     ON rg.object_id = nt.object_id
                AND rg.pdw_node_id = nt.pdw_node_id
                AND rg.distribution_id = nt.distribution_id
        WHERE rg.index_id = 1
        GROUP BY sm.name, tb.name, tb.object_id
    ) actualRowCounts
    on objIdsWithStats.object_id = actualRowCounts.object_id
    
    
  • Consulta 2: descubra a idade de suas estatísticas verificando a última vez em que suas estatísticas foram atualizadas em cada tabela.

    Observação

    Se houver uma alteração importante na distribuição de valores de uma coluna, você deverá atualizar as estatísticas independentemente da última vez em que elas foram atualizadas.

    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 pool de SQL dedicado, por exemplo, normalmente precisam de atualizações frequentes de estatísticas. Sempre que há um carregamento de novas linhas no pool de SQL dedicado, novas datas de carga ou de transação são adicionadas. Essas adições alteram a distribuição de dados e torna as estatísticas desatualizadas.

Por outro lado, as estatísticas de uma coluna de gênero em uma tabela de clientes talvez nunca precisem ser atualizadas. 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.

Se o seu pool de SQL dedicado contiver apenas um gênero e um novo requisito resultar em gêneros múltiplos, será necessário atualizar as estatísticas sobre a coluna de gênero.

Para obter mais informações, consulte as diretrizes gerais para Estatísticas.

Implementar gerenciamento de estatísticas

Geralmente, é uma boa ideia estender o processo de carregamento de dados para garantir que as estatísticas sejam atualizadas no final da carga para evitar ou minimizar a contenção de recursos ou o bloqueio entre consultas simultâneas.

É no carregamento de dados que as tabelas frequentemente mudam de tamanho ou sua distribuição de valores. O carregamento de dados é um momento lógico para implementar alguns processos de gerenciamento.

Os seguintes princípios orientadores são fornecidos para atualizar suas estatísticas:

  • Certifique-se de que cada tabela carregada tenha pelo menos um objeto de estatísticas atualizado. 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.
  • Concentre-se em colunas que participam de cláusulas JOIN, GROUP BY, ORDER BY e DISTINCT.
  • Considere atualizar com mais frequência as colunas de chave crescente, como datas de transação, porque esses valores não são incluídos no histograma de estatísticas.
  • Considere atualizar as colunas de distribuição estática com menos frequência.
  • Lembre-se, cada objeto estatístico é atualizado em sequência. Simplesmente implementar UPDATE STATISTICS <TABLE_NAME> nem sempre é ideal, especialmente para tabelas amplas com muitos objetos de estatística.

Para obter mais informações, consulte Estimativa de cardinalidade.

Exemplos: Criar estatísticas

Estes exemplos mostram como usar várias opções para a criação de estatísticas. As opções usadas para cada coluna dependem das características dos dados e de como a coluna é usada em consultas.

Criar estatísticas de coluna única com opções padrão

Para criar estatísticas em uma coluna, forneça um nome para o objeto de estatísticas e o nome da coluna.

Esta sintaxe usa todas as opções padrão. Por padrão, é feita a amostragem de 20 por cento da tabela ao criar estatísticas.

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

Por exemplo:

CREATE STATISTICS col1_stats ON dbo.table1 (col1);

Criar estatísticas de coluna única examinando cada linha

A taxa de amostragem padrão de 20 por cento é suficiente para a maioria das situações. No entanto, você pode ajustar essa taxa de amostragem.

Para usar toda a tabela como amostragem, use a seguinte sintaxe:

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

Por exemplo:

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

Criar estatísticas de coluna única, especificando o tamanho da amostra

Como alternativa, você pode especificar o tamanho da amostra como uma porcentagem:

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

Criar estatísticas de coluna única em apenas algumas das linhas

Também é possível criar estatísticas em uma parte das linhas na tabela. Isso é chamado de estatística filtrada.

Por exemplo, é possível usar estatísticas filtradas quando você planeja consultar uma partição específica de uma tabela particionada grande. Ao criar estatísticas apenas sobre os valores de partição, a precisão das estatísticas melhora, o que melhor o desempenho da consulta.

Este exemplo cria estatísticas em um intervalo de valores. Os valores podem ser facilmente definidos para corresponder ao intervalo de valores em uma partição.

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. Usando o exemplo anterior, a cláusula WHERE da consulta precisa especificar valores col1 entre 2000101 e 20001231.

Criar estatísticas de coluna única com todas as opções

Também é possível combinar as opções juntas. O exemplo a seguir cria um objeto estatístico filtrado com um tamanho de amostra personalizado:

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.

Criar estatísticas de várias colunas

Para criar um objeto estatístico de várias colunas, use os exemplos anteriores, mas especifique mais colunas.

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.

Neste exemplo, o histograma está em product_category. As estatísticas entre colunas são calculadas em product_category e 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 product_category e product_sub_category, um objeto de estatísticas de várias colunas pode ser útil se essas colunas forem acessadas ao mesmo tempo.

Criar estatísticas em todas as coluna em uma tabela

Uma maneira de criar estatísticas é emitir comando CREATE STATISTICS depois de criar a tabela:

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);

Usar um procedimento armazenado para criar estatísticas em todas as colunas em um pool de SQL

O pool de SQL dedicado não tem um procedimento armazenado do sistema equivalente a sp_create_stats no SQL Server. Esse procedimento armazenado cria um objeto de estatísticas de coluna único em todas as colunas do pool de SQL que ainda não tenham estatísticas.

O exemplo a seguir mostra como começar seu design do pool de SQL. Fique à vontade para adaptá-lo às suas necessidades.

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 da tabela usando os padrões, realize o procedimento armazenado.

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

Para criar estatísticas em todas as colunas da tabela usando uma verificação completa, chame esse procedimento.

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

Para criar estatísticas de amostra em todas as colunas na tabela, insira 3 e o percentual da amostra. Esse procedimento usa uma taxa de amostra de 20%.

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

Exemplos: Atualizar estatísticas

Para atualizar as estatísticas, você pode:

  • Atualizar um objeto de estatísticas. Especifique o nome do objeto de estatísticas que você deseja atualizar.
  • Atualizar todos os objetos de estatísticas em uma tabela. Especifique o nome da tabela em vez de um objeto de estatísticas específico.

Atualizar um objeto de estatísticas específico

Use a sintaxe a seguir para atualizar um objeto de estatísticas específico:

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

Por exemplo:

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. Isso requer algum planejamento para escolher os melhores objetos de estatísticas a serem atualizados.

Atualizar todas as estatísticas de uma tabela

Um método simples para atualizar todos os objetos de estatísticas em uma tabela é:

UPDATE STATISTICS [schema_name].[table_name];

Por exemplo:

UPDATE STATISTICS dbo.table1;

A instrução UPDATE STATISTICS é fácil de usar. Lembre-se de que isso atualizará todas as estatísticas na tabela e, portanto, poderá executar mais trabalho do que o necessário. Caso o desempenho não seja um problema, essa é a maneira mais fácil e completa de garantir que as estatísticas sejam atualizadas.

Observação

Ao atualizar todas as estatísticas em uma tabela, o pool de SQL dedicado faz um exame a fim de coletar amostras da tabela para cada objeto de estatísticas. 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.

Para ver uma implementação de um procedimento UPDATE STATISTICS, consulte Tabelas Temporárias. O método de implementação é ligeiramente diferente do procedimento anterior CREATE STATISTICS, mas o resultado é o mesmo.

Para ver a sintaxe completa, consulte Atualizar estatísticas.

Metadados de estatísticas

Há várias exibições e funções do sistema que podem ser utilizadas para localizar informações sobre estatísticas. 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.

Exibições de catálogo para as estatísticas

Essas exibições do sistema fornecem informações sobre estatísticas:

Exibição de catálogo Descrição
sys.columns Uma linha para cada coluna
sys.objects Uma linha para cada objeto no banco de dados
sys.schemas Uma linha para cada esquema no banco de dados
sys.stats Uma linha para cada objeto de estatísticas
sys.stats_columns Uma linha para cada coluna no objeto de estatísticas; está vinculada a sys.columns
sys.tables Uma linha para cada tabela (inclui tabelas externas)
sys.table_types Uma linha para cada tipo de dados

Funções de sistema para estatísticas

Essas funções de sistema são úteis para trabalhar com estatísticas:

Função do sistema Descrição
STATS_DATE Data da última atualização do objeto de estatísticas
DBCC SHOW_STATISTICS Nível de resumo e informações detalhadas sobre a distribuição de valores conforme entendido pelo objeto de estatísticas

Combinar colunas de estatísticas e funções em uma exibição

Essa exibição une as colunas relacionadas às estatísticas e os resultados da função STATS_DATE().

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() mostra os dados contidos em um objeto de estatísticas. Esses dados estão divididos em três partes:

  • Cabeçalho
  • Vetor de densidade
  • Histograma

Os metadados de cabeçalho sobre as estatísticas. O histograma exibe a distribuição de valores na primeira coluna de chave do objeto de estatísticas. O vetor de densidade mede a correlação entre colunas.

Observação

O pool de SQL dedicado calcula as estimativas de cardinalidade com os dados do objeto das estatística.

Mostrar cabeçalho, densidade e histograma

Este exemplo simples mostra as três partes de um objeto de estatísticas:

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

Por exemplo:

DBCC SHOW_STATISTICS (dbo.table1, stats_col1);

Mostrar uma ou mais partes de DBCC SHOW_STATISTICS()

Se você estiver interessado apenas em visualizar partes específicas, use a cláusula WITH e especifique quais partes deseja ver:

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

Por exemplo:

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

Diferenças do DBCC SHOW_STATISTICS()

DBCC SHOW_STATISTICS() é implementado mais estritamente no pool de SQL dedicado em comparação com o SQL Server:

  • Recursos não documentados não são suportados.
  • Não é possível usar Stats_stream.
  • Não é possível unir resultados a subconjuntos específicos de dados estatísticos. Por exemplo, STAT_HEADER JOIN DENSITY_VECTOR.
  • NO_INFOMSGS não pode ser definido para supressão de mensagem.
  • Colchetes em torno dos nomes das estatísticas não podem ser usados.
  • Não é possível usar nomes de colunas para identificar objetos de estatísticas.
  • O erro personalizado 2767 não é suportado.

Monitorar a carga de trabalho do pool de SQL dedicado do Azure Synapse Analytics usando DMVs