Compartilhar via


Avalie a precisão das estatísticas do PDW

Este artigo mostra como avaliar a precisão das estatísticas do PDW de uma tabela do PDW ou de todas as tabelas em um banco de dados do PDW com base na contagem total de linhas.

Versão original do produto: SQL Server 2012 Parallel Data Warehouse (APS), SQL Server 2008 R2 Parallel Data Warehouse
Número original do KB: 3046875

Resumo

Este artigo contém uma consulta para comparar a contagem real de linhas e a contagem de linhas nas estatísticas do Parallel Data Warehouse para uma tabela específica ou para todas as tabelas no banco de dados atual. Se os valores de contagem de linhas forem muito diferentes, o Parallel Data Warehouse não terá estatísticas precisas para essa tabela. Isso pode fazer com que o otimizador do Parallel Data Warehouse escolha operações e movimentações de dados que não são eficientes e que podem causar longos tempos de execução de consulta.

Mais informações

Execute a seguinte consulta para mostrar uma comparação entre a contagem real de linhas e a contagem de linhas CTL exibida nas estatísticas do Parallel Data Warehouse:

SELECT db_name() as [Database],
    pdwtbl.name as [Table],
    Sum(part.rows)/ max(pdwpart.partition_number)/8 AS CMP_ROW_COUNT,
    sum(pdwpart.rows)/max(size.distribution_id)/max(pdwpart.partition_number)/8 AS CTL_ROW_COUNT
FROM sys.pdw_nodes_partitions part
JOIN sys.pdw_nodes_tables tbl
    ON part.object_id = tbl.object_id
    AND part.pdw_node_id = tbl.pdw_node_id
JOIN sys.pdw_distributions size
    on size.pdw_node_id = tbl.pdw_node_id
JOIN sys.pdw_table_mappings map
    ON map.physical_name = tbl.name
JOIN sys.tables pdwtbl
    ON pdwtbl.object_id = map.object_id
JOIN sys.partitions pdwpart
    ON pdwpart.object_id = pdwtbl.object_id
join sys.pdw_table_distribution_properties dist
    on pdwtbl.object_id = dist.object_id
WHERE dist.distribution_policy = 2
-- uncomment the below if you are looking for row counts for a specific table
-- this table will also need to be added below
-- and pdwtbl.name = 'table_name'
GROUP BY pdwtbl.name
UNION ALL
SELECT db_name() as [Database],
    pdwtbl.name,
    Sum(part.rows)/ sum(pdwpart.partition_number) AS CMP_ROW_COUNT,
    sum(pdwpart.rows) /max(pdwpart.partition_number) /(select count(type) from sys.dm_pdw_nodes
    where type = ''' + 'COMPUTE' + ''')
AS CTL_ROW_COUNT
FROM sys.pdw_nodes_partitions part
JOIN sys.pdw_nodes_tables tbl
    ON part.object_id = tbl.object_id
    AND part.pdw_node_id = tbl.pdw_node_id
JOIN sys.pdw_table_mappings map
    ON map.physical_name = tbl.name
JOIN sys.tables pdwtbl
    ON pdwtbl.object_id = map.object_id
JOIN sys.partitions pdwpart
    ON pdwpart.object_id = pdwtbl.object_id
join sys.pdw_table_distribution_properties dist
    on pdwtbl.object_id = dist.object_id
where dist.distribution_policy = 3
-- uncomment the below if you are looking for row counts for a specific table
-- this table will also need to be added below
-- and pdwtbl.name = 'table_name'
GROUP BY pdwtbl.name

Observação

  • Essa consulta avalia apenas as contagens de linhas e não a cardinalidade. Também requer que as estatísticas de nível do Parallel Data Warehouse existam em pelo menos uma coluna da tabela. Ele não leva em conta se as estatísticas existem em mais de uma coluna ou para qual coluna as estatísticas existem.
  • O valor de contagem padrão no Parallel Data Warehouse é de 1.000 linhas. Se nenhuma estatística do Data Warehouse Paralelo tiver sido criada, um valor de 1000 será retornado para a contagem de linhas CTL.