Criar e atualizar estatísticas de tabelas em pool SQL dedicado

Tip

Microsoft Fabric Data Warehouse é um armazém relacional de escala empresarial baseado numa base de data lake, com uma arquitetura pronta para o futuro, IA incorporada e novas funcionalidades. Se és novo no data warehousing, começa pelo Fabric Data Warehouse. As cargas de trabalho existentes de pool SQL dedicado podem atualizar para o Fabric para acessar novas capacidades em ciência de dados, análise em tempo real e relatórios.

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

Porquê utilizar estatísticas

Quanto mais o pool SQL dedicado souber sobre os seus dados, mais rapidamente poderá executar consultas a eles. Depois de carregar dados num pool SQL dedicado, recolher estatísticas dos seus dados é uma das coisas mais importantes que pode fazer para otimizar as suas consultas.

O otimizador de consulta de pool SQL dedicado é um otimizador baseado em custo. Ele compara o custo de vários planos de consulta e, em seguida, escolhe o plano com o menor custo. Na maioria dos casos, escolhe o plano que executa mais rápido.

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

Criação automática de estatística

Quando a opção de base de dados AUTO_CREATE_STATISTICS está ativada, um pool SQL dedicado analisa as consultas dos utilizadores recebidas à procura de estatísticas em falta.

Se as estatísticas estiverem ausentes, o otimizador de consulta criará estatísticas em colunas individuais no predicado de consulta ou na condição de junção para melhorar as estimativas de cardinalidade para o plano de consulta.

Nota

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

Pode verificar se o seu pool SQL dedicado está AUTO_CREATE_STATISTICS configurado executando o seguinte comando T-SQL:

SELECT name, is_auto_create_stats_on
FROM sys.databases

Se o seu pool SQL dedicado não tiver AUTO_CREATE_STATISTICS configurado, recomendamos que ative esta propriedade executando o seguinte comando. Substitui <your-datawarehouse-name> pelo nome do teu pool SQL dedicado.

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

Estas afirmações desencadeiam a criação automática de estatísticas:

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

Nota

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

A criação automática de estatísticas é feita de forma síncrona, de modo que você pode incorrer em 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, você deve garantir que as estatísticas tenham sido criadas primeiro executando a carga de trabalho de referência antes de criar o perfil do sistema.

Nota

A criação de estatísticas é registada em sys.dm_pdw_exec_requests num contexto de utilizador diferente.

Quando as estatísticas automáticas são criadas, assumem a forma: _WA_Sys_<8 digit column id in Hex>_<8 digit table id in Hex>. Pode ver estatísticas que já foram criadas ao executar o comando DBCC SHOW_STATISTICS :

DBCC SHOW_STATISTICS (<table_name>, <target>)

Este table_name é o nome da tabela que contém as estatísticas a mostrar. Esta tabela não pode ser uma tabela externa. O alvo é o nome do índice, das estatísticas ou da coluna para os quais se deseja exibir informações estatísticas.

Atualizar estatísticas

Uma prática recomendada é atualizar as estatísticas nas colunas de data todos os dias à medida que novas datas são adicionadas. Cada vez que novas linhas são carregadas no pool SQL dedicado, são adicionadas novas datas de carregamento ou datas de transação. Estes aditamentos alteram a distribuição dos dados e tornam as estatísticas desatualizadas.

Estatísticas numa coluna de país/região numa tabela de clientes podem nunca precisar de ser atualizadas, pois a distribuição dos valores geralmente não muda. Supondo que a distribuição seja constante entre os clientes, adicionar novas linhas à variação da tabela não alterará a distribuição de dados.

No entanto, se o seu pool SQL dedicado contiver apenas um país/região, e trouxer dados de um novo país/região, resultando em dados de vários países/regiões armazenados, então precisa de atualizar as estatísticas na coluna país/região.

Seguem-se recomendações para a atualização das estatísticas:

Atributo de estatísticas Recomendação
Frequência das atualizações de estatísticas Conservador: Diariamente
Após carregar ou transformar os seus dados
Sampling Menos de 1 bilhão de linhas, use amostragem padrão (20%).
Com mais de 1 bilhão de linhas, use amostragem de dois por cento.

Uma das primeiras perguntas a fazer quando se está a resolver um problema é : "As estatísticas estão atualizadas?"

Esta questão 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 material nos dados subjacentes. Quando o número de linhas mudou substancialmente, ou há uma mudança material na distribuição de valores para uma coluna, então é hora de atualizar as estatísticas.

Não existe uma vista de gestão dinâmica para determinar se os dados dentro da tabela mudaram desde a última atualização das estatísticas. As duas perguntas seguintes podem ajudá-lo a determinar se as suas estatísticas estão obsoletas.

  • Pergunta 1: Encontre a diferença entre a contagem de linhas a partir da estatística (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
    
    
  • Pergunta 2: Verifique a idade das suas estatísticas verificando a última vez que as suas estatísticas foram atualizadas em cada tabela.

    Nota

    Se houver uma alteração significativa na distribuição dos valores de uma coluna, deve atualizar as estatísticas independentemente da última vez que 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;
    

Colunas de data num pool SQL dedicado, por exemplo, normalmente precisam de atualizações estatísticas frequentes. Cada vez que novas linhas são carregadas no pool SQL dedicado, são adicionadas novas datas de carregamento ou datas de transação. Estes aditamentos alteram a distribuição dos dados e tornam as estatísticas desatualizadas.

Por outro lado, as estatísticas numa coluna de género de uma tabela de clientes podem nunca precisar de atualizações. Supondo que a distribuição seja constante entre os clientes, adicionar novas linhas à variação da tabela não alterará a distribuição de dados.

Se o seu pool SQL dedicado contiver apenas um género e um novo requisito resultar em múltiplos géneros, então precisa de atualizar as estatísticas na coluna de género.

Para mais informações, consulte orientações gerais para Estatística.

Implementar a gestão de estatísticas

É frequentemente uma boa ideia prolongar o processo de carregamento de dados para garantir que as estatísticas são atualizadas no final da carga, evitando ou minimizando bloqueios ou contendas de recursos entre consultas concorrentes.

A carga de dados é quando as tabelas mudam mais frequentemente o seu tamanho ou a sua distribuição de valores. O carregamento de dados é um local lógico para implementar alguns processos de gestão.

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

  • Certifique-se de que cada tabela carregada tem, pelo menos, um objeto de estatísticas atualizado. Isto atualiza o tamanho da tabela (contagem de linhas e contagem de páginas) como parte da atualização estatística.
  • Concentre-se nas colunas que participam das cláusulas JOIN, GROUP BY, ORDER BY e DISTINCT.
  • Considere atualizar colunas-chave ascendentes , como datas de transações, com mais frequência, porque estes valores não estão incluídos no histograma de estatísticas.
  • Considere atualizar as colunas de distribuição estática com menos frequência.
  • Lembre-se de cada objeto estatístico é atualizado em sequência. A simples implementação UPDATE STATISTICS <TABLE_NAME> nem sempre é ideal, especialmente para tabelas amplas com muitos objetos estatísticos.

Para obter mais informações, consulte Cardinality Estimation.

Exemplos: Criar estatísticas

Estes exemplos mostram como usar várias opções para criar estatísticas. As opções que usa para cada coluna dependem das características dos seus dados e de como a coluna é usada nas consultas.

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

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

Essa sintaxe usa todas as opções padrão. Por defeito, 20 por cento da tabela é amostrada 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);

Crie estatísticas de coluna única examinando cada linha

A taxa de amostragem padrão de 20% é suficiente para a maioria das situações. No entanto, é possível ajustar a taxa de amostragem.

Para obter um exemplo da tabela completa, use esta 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;

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

Alternativamente, pode especificar o tamanho da amostra como uma percentagem:

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 podes criar estatísticas numa parte das linhas da tua tabela. Isto chama-se estatística filtrada.

Por exemplo, você pode usar estatísticas filtradas quando planeja consultar uma partição específica de uma tabela particionada grande. Ao criar estatísticas apenas com os valores das partições, a precisão das estatísticas melhora, o que melhora o desempenho das consultas.

Este exemplo cria estatísticas sobre 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';

Nota

Para que o otimizador de consulta considere o uso de estatísticas filtradas ao escolher o plano de consulta distribuído, a consulta deve caber dentro da 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.

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

Você também pode combinar as opções. O exemplo a seguir cria um objeto de estatísticas 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 com várias colunas

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

Nota

O histograma, que é usado para estimar o número de linhas no resultado da consulta, só está disponível para a primeira coluna listada na definição do objeto de estatística.

Neste exemplo, o histograma está em product_category. As estatísticas cruzadas 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 existe uma correlação entre product_category e product_sub_category, um objeto de estatísticas multi-colunas pode ser útil se estas colunas forem acedidas ao mesmo tempo.

Criar estatísticas em todas as colunas de uma tabela

Uma forma de criar estatísticas é emitir CREATE STATISTICS comandos após 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);

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

Um pool SQL dedicado não tem um procedimento armazenado de sistema equivalente ao sp_create_stats em SQL Server. Este procedimento armazenado cria um objeto de estatísticas de uma única coluna em cada coluna de um pool SQL que ainda não tem estatísticas.

O exemplo seguinte mostra como começar a conceber o seu pool SQL. Sinta-se à 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, execute o procedimento armazenado.

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

Para criar estatísticas de todas as colunas da tabela usando uma varredura completa, chame este procedimento.

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

Para criar estatísticas amostradas em todas as colunas da tabela, introduza 3 e a percentagem da amostra. Este procedimento utiliza uma taxa de amostragem de 20 por cento.

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

Exemplos: Atualizar estatísticas

Para atualizar as estatísticas, você pode:

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

Atualizar um objeto de estatística específico

Use a sintaxe a seguir para atualizar um objeto de estatística 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 gerenciar estatísticas. Fazer isso requer alguma reflexão para escolher os melhores objetos de estatísticas a atualizar.

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 UPDATE STATISTICS afirmação é fácil de usar. Lembra-te apenas que atualiza todas as estatísticas na tabela e, por isso, pode desempenhar mais trabalho do que o necessário. Se o desempenho não for um problema, esta é a forma mais fácil e completa de garantir que as estatísticas estão atualizadas.

Nota

Quando atualizas todas as estatísticas numa tabela, um pool SQL dedicado faz uma análise para amostrar a tabela de cada objeto de estatísticas. Se a tabela for grande e tiver muitas colunas e muitas estatísticas, pode ser mais eficiente atualizar estatísticas individuais com base na necessidade.

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

Para a sintaxe completa, veja Atualizar Estatísticas.

Metadados estatísticos

Existem várias visualizações do sistema e funções que você pode usar para encontrar informações sobre estatísticas. Por exemplo, pode verificar se um objeto de estatísticas pode estar desatualizado usando a função data-estatísticas para ver quando as estatísticas foram criadas ou atualizadas pela última vez.

Visualizações de catálogo para estatísticas

Estas visualizações do sistema fornecem informações sobre estatísticas:

Visualização do catálogo Descrição
sys.columns Uma linha para cada coluna
sys.objects Uma linha para cada objeto na base de dados
sys.schemas Uma linha para cada esquema na base 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; Links de volta para sys.columns
sys.tables Uma linha para cada tabela (inclui tabelas externas)
sys.table_types Uma linha para cada tipo de dado

Funções do sistema para estatísticas

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

Função do sistema Descrição
STATS_DATE Data em que o objeto de estatísticas foi atualizado pela última vez
DBCC SHOW_STATISTICS Nível sumário e informação detalhada sobre a distribuição dos valores conforme entendida pelo objeto de estatísticas

Combine estatísticas, colunas e funções em uma única exibição

Esta perspetiva reúne colunas que se relacionam com estatísticas e resultados da STATS_DATE() função.

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 dentro de um objeto de estatísticas. Estes dados dividem-se em três partes:

  • Cabeçalho
  • Vetor de densidade
  • Histograma

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

Nota

O pool SQL dedicado calcula estimativas de cardinalidade com qualquer um dos dados no objeto de estatística.

Mostrar cabeçalho, densidade e histograma

Este exemplo simples mostra todas 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 do DBCC SHOW_STATISTICS()

Se você estiver interessado apenas em visualizar partes específicas, use a WITH cláusula 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

DBCC SHOW_STATISTICS() diferenças

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

  • Funcionalidades não documentadas não são suportadas.
  • Não posso usar Stats_stream.
  • Não é possível juntar resultados para 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 mensagens.
  • Os colchetes em torno dos nomes das estatísticas não podem ser usados.
  • Não é possível usar nomes de coluna para identificar objetos de estatística.
  • O erro personalizado 2767 não é suportado.

Monitorize a sua Azure Synapse Analytics carga de trabalho dedicada de pool SQL usando DMVs