Estatísticas de tabela para o conjunto de SQL dedicado no Azure Synapse Analytics
Neste artigo, encontrará recomendações e exemplos para criar e atualizar estatísticas de otimização de consultas em tabelas no conjunto de SQL dedicado.
Porquê utilizar estatísticas
Quanto mais conjunto de SQL dedicado souber sobre os seus dados, mais rapidamente poderá executar consultas nos mesmos. Depois de carregar dados para o conjunto de SQL dedicado, recolher estatísticas nos seus dados é uma das coisas mais importantes que pode fazer para otimizar as suas consultas.
O otimizador de consultas do conjunto de SQL dedicado é um otimizador baseado em custos. Compara o custo de vários planos de consulta e, em seguida, escolhe o plano com o custo mais baixo. Na maioria dos casos, escolhe o plano que irá executar o mais rápido.
Por exemplo, se o otimizador estimar que a data em que a consulta está a filtrar irá devolver uma linha, escolherá um plano. Se estimar que a data selecionada devolverá 1 milhão de linhas, devolverá um plano diferente.
Criação automática de estatística
Quando a opção AUTO_CREATE_STATISTICS base de dados está ativada, o conjunto de SQL dedicado analisa as consultas de utilizador recebidas para obter estatísticas em falta.
Se as estatísticas estiverem em falta, o otimizador de consultas cria estatísticas em colunas individuais no predicado de consulta ou condição de associação para melhorar as estimativas de cardinalidade do plano de consulta.
Nota
A criação automática de estatísticas está ativada por predefinição.
Pode verificar se o conjunto de SQL dedicado AUTO_CREATE_STATISTICS configurado ao executar o seguinte comando:
SELECT name, is_auto_create_stats_on
FROM sys.databases
Se o conjunto de SQL dedicado não tiver AUTO_CREATE_STATISTICS configurado, recomendamos que ative esta propriedade ao executar o seguinte comando:
ALTER DATABASE <yourdatawarehousename>
SET AUTO_CREATE_STATISTICS ON
Estas instruções irão acionar a criação automática de estatísticas:
- SELECIONAR
- INSERT-SELECT
- CTAS
- UPDATE
- DELETE
- EXPLICAR quando contém uma associação ou a presença de um predicado é detetada
Nota
A criação automática de estatísticas não é criada em tabelas temporárias ou externas.
A criação automática de estatísticas é feita de forma síncrona, pelo que poderá degradar ligeiramente o desempenho das consultas se as colunas estiverem em falta. O tempo para criar estatísticas para uma única coluna depende do tamanho da tabela.
Para evitar uma degradação mensurável do desempenho, deve garantir que as estatísticas foram criadas primeiro ao executar a carga de trabalho de referência antes de criar a criação de perfis do sistema.
Nota
A criação de estatísticas será registada no sys.dm_pdw_exec_requests num contexto de utilizador diferente.
Quando as estatísticas automáticas são criadas, assumem o formulário: WA_Sys<ID da coluna de 8 dígitos no ID da tabela hex>_<8 dígitos no Hex>. Pode ver estatísticas que já foram criadas ao executar o comando de SHOW_STATISTICS DBCC :
DBCC SHOW_STATISTICS (<table_name>, <target>)
O table_name é o nome da tabela que contém as estatísticas a apresentar. Esta tabela não pode ser uma tabela externa. O destino é o nome do índice de destino, estatísticas ou coluna para o qual apresentar informações de estatísticas.
Atualização de estatísticas
Uma das melhores práticas é atualizar as estatísticas em colunas de data todos os dias à medida que são adicionadas novas datas. Sempre que forem carregadas novas linhas no conjunto de SQL dedicado, são adicionadas novas datas de carregamento ou de transação. Estas adições alteram a distribuição de dados e tornam as estatísticas desatualizadas.
As estatísticas numa coluna de país/região numa tabela de clientes podem nunca ter de ser atualizadas, uma vez que a distribuição de valores geralmente não é alterada. Partindo do princípio de que a distribuição é constante entre os clientes, a adição de novas linhas à variação da tabela não irá alterar a distribuição de dados.
No entanto, se o conjunto de SQL dedicado contiver apenas um país/região e introduzir dados de um novo país/região, o que resulta no armazenamento de dados de vários países/regiões, terá de atualizar as estatísticas na coluna país/região.
Seguem-se recomendações para atualizar as estatísticas:
Atributo de estatísticas | Recomendação |
---|---|
Frequência de atualizações de estatísticas | Conservador: Diariamente após carregar ou transformar os seus dados |
Amostragem | Menos de mil milhões de linhas, utilize a amostragem predefinida (20%).
Com mais de mil milhões de linhas, utilize a amostragem de 2%. |
Uma das primeiras perguntas a fazer quando está a resolver problemas de uma consulta é : "As estatísticas estão atualizadas?"
Esta pergunta não é uma pergunta que possa ser respondida pela idade dos dados. Um objeto de estatística atualizado pode ser antigo se não tiver havido nenhuma alteração material aos dados subjacentes. Quando o número de linhas tiver sido alterado substancialmente ou se existir uma alteração material na distribuição de valores de uma coluna, é altura de atualizar as estatísticas.
Não existe nenhuma vista de gestão dinâmica para determinar se os dados na tabela foram alterados desde a última vez que as estatísticas foram atualizadas. As duas consultas seguintes podem ajudá-lo a determinar se as 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 de linhas real (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 das estatísticas ao verificar a última vez que as estatísticas foram atualizadas em cada tabela.
Nota
Se existir uma alteração material na distribuição de valores de uma coluna, deve atualizar as estatísticas independentemente da última vez que foram atualizados.
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 num conjunto de SQL dedicado, por exemplo, normalmente precisam de atualizações de estatísticas frequentes. Sempre que forem carregadas novas linhas no conjunto de SQL dedicado, são adicionadas novas datas de carregamento ou de transação. Estas adições alteram a distribuição de dados e tornam as estatísticas desatualizadas.
Por outro lado, as estatísticas numa coluna de género numa tabela de clientes poderão nunca ter de ser atualizadas. Partindo do princípio de que a distribuição é constante entre os clientes, a adição de novas linhas à variação da tabela não irá alterar a distribuição de dados.
Se o conjunto de SQL dedicado contiver apenas um género e um novo requisito resultar em múltiplos sexos, terá de atualizar as estatísticas na coluna de género.
Para obter mais informações, veja orientações gerais para Estatísticas.
Implementar a gestão de estatísticas
Muitas vezes, é boa ideia expandir o seu processo de carregamento de dados para garantir que as estatísticas são atualizadas no final da carga para evitar/minimizar o bloqueio ou a contenção de recursos entre consultas simultâneas.
O carregamento de dados é quando as tabelas alteram mais frequentemente o respetivo tamanho e/ou a respetiva distribuição de valores. O carregamento de dados é um local lógico para implementar alguns processos de gestão.
São fornecidos os seguintes princípios de orientação para atualizar as estatísticas:
- Certifique-se de que cada tabela carregada tem, pelo menos, um objeto de estatística atualizado. Esta ação atualiza as informações de tamanho da tabela (contagem de linhas e contagem de páginas) como parte da atualização de estatísticas.
- Concentre-se nas colunas que participam nas cláusulas JOIN, GROUP BY, ORDER BY e DISTINCT.
- Considere atualizar colunas de "chave ascendente", como datas de transação com mais frequência, uma vez que estes valores não serão incluídos no histograma de estatísticas.
- Considere atualizar as colunas de distribuição estáticas com menos frequência.
- Lembre-se de que cada objeto de estatística é atualizado em sequência. A simples implementação
UPDATE STATISTICS <TABLE_NAME>
nem sempre é ideal, especialmente para tabelas largas com muitos objetos de estatística.
Para obter mais informações, veja Estimativa da Cardinalidade.
Exemplos: Criar estatísticas
Estes exemplos mostram como utilizar várias opções para criar estatísticas. As opções que utiliza para cada coluna dependem das características dos seus dados e da forma como a coluna será utilizada nas consultas.
Criar estatísticas de coluna única com opções predefinidas
Para criar estatísticas numa coluna, forneça um nome para o objeto de estatística e o nome da coluna.
Esta sintaxe utiliza todas as opções predefinidas. Por predefinição, 20% 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);
Criar estatísticas de coluna única ao examinar cada linha
A taxa de amostragem predefinida de 20 por cento é suficiente para a maioria das situações. No entanto, pode ajustar a taxa de amostragem.
Para amostrar a tabela completa, utilize 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;
Criar estatísticas de coluna única ao especificar o tamanho da amostra
Em alternativa, 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 apenas em algumas das linhas
Também pode criar estatísticas numa parte das linhas na tabela. Isto chama-se estatística filtrada.
Por exemplo, pode utilizar estatísticas filtradas quando planeia consultar uma partição específica de uma grande tabela particionada. Ao criar estatísticas apenas sobre os valores de partição, a precisão das estatísticas melhorará e, por conseguinte, melhorará 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 numa partição.
CREATE STATISTICS stats_col1 ON table1(col1) WHERE col1 > '2000101' AND col1 < '20001231';
Nota
Para o otimizador de consultas considerar a utilização de estatísticas filtradas quando escolher o plano de consulta distribuído, a consulta tem de caber dentro da definição do objeto de estatística. Com o exemplo anterior, a cláusula WHERE da consulta tem de especificar valores col1 entre 2000101 e 20001231.
Criar estatísticas de coluna única com todas as opções
Também pode combinar as opções em conjunto. O exemplo seguinte cria um objeto de estatística filtrado com um tamanho de exemplo personalizado:
CREATE STATISTICS stats_col1 ON table1 (col1) WHERE col1 > '2000101' AND col1 < '20001231' WITH SAMPLE = 50 PERCENT;
Para obter a referência completa, veja CREATE STATISTICS (CRIAR ESTATÍSTICAS).
Criar estatísticas de várias colunas
Para criar um objeto de estatísticas com várias colunas, utilize os exemplos anteriores, mas especifique mais colunas.
Nota
O histograma, que é utilizado 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á no 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;
Uma vez que existe uma correlação entre product_category e product_sub_category, um objeto de estatísticas com várias colunas pode ser útil se estas colunas forem acedidas ao mesmo tempo.
Criar estatísticas em todas as colunas numa tabela
Uma forma de criar estatísticas é emitir comandos 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);
Utilizar um procedimento armazenado para criar estatísticas em todas as colunas num conjunto de SQL
O conjunto de SQL dedicado não tem um procedimento armazenado pelo sistema equivalente a sp_create_stats no SQL Server. Este procedimento armazenado cria um objeto de estatística de coluna única em cada coluna num conjunto de SQL que ainda não tem estatísticas.
O exemplo seguinte irá ajudá-lo a começar a utilizar a estrutura do conjunto de SQL. Não hesite em 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 na tabela com as predefinições, execute o procedimento armazenado.
EXEC [dbo].[prc_sqldw_create_stats] 1, NULL;
Para criar estatísticas em todas as colunas na tabela com um fullscan, chame este procedimento.
EXEC [dbo].[prc_sqldw_create_stats] 2, NULL;
Para criar estatísticas de exemplo em todas as colunas da tabela, introduza 3 e a percentagem de exemplo. Este procedimento utiliza uma taxa de exemplo de 20%.
EXEC [dbo].[prc_sqldw_create_stats] 3, 20;
Exemplos: Atualizar estatísticas
Para atualizar as estatísticas, pode:
- Atualizar um objeto de estatística. Especifique o nome do objeto de estatística que pretende atualizar.
- Atualizar todos os objetos de estatística numa tabela. Especifique o nome da tabela em vez de um objeto de estatística específico.
Atualizar um objeto de estatística específico
Utilize a seguinte sintaxe 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ística específicos, pode minimizar o tempo e os recursos necessários para gerir as estatísticas. Ao fazê-lo, é necessário pensar em escolher os melhores objetos de estatística a atualizar.
Atualizar todas as estatísticas numa tabela
Um método simples para atualizar todos os objetos de estatística numa tabela é:
UPDATE STATISTICS [schema_name].[table_name];
Por exemplo:
UPDATE STATISTICS dbo.table1;
A instrução UPDATE STATISTICS é fácil de utilizar. Lembre-se apenas de que atualiza todas as estatísticas na tabela e, por conseguinte, pode realizar 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
Ao atualizar todas as estatísticas numa tabela, o conjunto de SQL dedicado faz uma análise para amostrar a tabela para cada objeto de estatística. Se a tabela for grande e tiver muitas colunas e muitas estatísticas, poderá ser mais eficiente atualizar estatísticas individuais com base nas necessidades.
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 obter a sintaxe completa, veja Atualizar Estatísticas.
Metadados de estatísticas
Existem várias vistas e funções do sistema que pode utilizar para encontrar informações sobre estatísticas. Por exemplo, pode ver se um objeto de estatística pode estar desatualizado ao utilizar a função stats-date para ver quando as estatísticas foram criadas ou atualizadas pela última vez.
Vistas de catálogo para estatísticas
Estas vistas de sistema fornecem informações sobre estatísticas:
Vista de 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ística. |
sys.stats_columns | Uma linha para cada coluna no objeto de estatísticas. Ligações para sys.columns. |
sys.tables | Uma linha para cada tabela (inclui tabelas externas). |
sys.table_types | Uma linha para cada tipo de dados. |
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ística foi atualizado pela última vez. |
DBCC SHOW_STATISTICS | Nível de resumo e informações detalhadas sobre a distribuição de valores, conforme compreendido pelo objeto de estatísticas. |
Combinar colunas e funções de estatística numa única vista
Esta vista reúne colunas relacionadas com estatísticas e 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 SHOW_STATISTICS() DBCC
DBCC SHOW_STATISTICS() mostra os dados contidos num objeto de estatística. Estes dados são fornecidos em três partes:
- Cabeçalho
- Vetor de densidade
- Histograma
Os metadados do cabeçalho sobre as estatísticas. O histograma apresenta a distribuição de valores na primeira coluna chave do objeto de estatísticas. O vetor de densidade mede a correlação entre colunas.
Nota
O conjunto de SQL dedicado calcula estimativas de cardinalidade com qualquer um dos dados no objeto de estatísticas.
Mostrar cabeçalho, densidade e histograma
Este exemplo simples mostra as três partes de um objeto de estatística:
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 só estiver interessado em ver partes específicas, utilize a WITH
cláusula e especifique as partes que pretende 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
O DBCC SHOW_STATISTICS() é implementado mais rigorosamente no conjunto de SQL dedicado em comparação com SQL Server:
- As funcionalidades não documentadas não são suportadas.
- Não é possível utilizar Stats_stream.
- Não é possível associar 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.
- Não é possível utilizar parênteses retos à volta dos nomes das estatísticas.
- Não é possível utilizar nomes de colunas para identificar objetos de estatística.
- O erro personalizado 2767 não é suportado.
Passos seguintes
Para melhorar ainda mais o desempenho das consultas, veja Monitorizar a carga de trabalho