Todos os produtos
Search
Central de documentação

ApsaraDB for SelectDB:Estatísticas

Última atualização: Jun 29, 2026

O ApsaraDB for SelectDB coleta estatísticas por coluna para ajudar o otimizador baseado em custo (CBO) a escolher planos de consulta eficientes. Acione a coleta manualmente ou permita que o sistema colete as estatísticas automaticamente.

Como funciona

Durante a otimização de consultas, o CBO usa estatísticas para estimar a seletividade de predicados e comparar os custos dos planos de execução. Estatísticas precisas resultam em melhor seleção de planos e consultas mais rápidas.

Todas as estatísticas coletadas são gravadas na tabela interna __internal_schema.column_statistics. Antes de executar qualquer tarefa de coleta, o frontend (FE) verifica se todos os tablets dessa tabela estão disponíveis. Se detectar algum tablet indisponível, o sistema rejeita a tarefa.

Estatísticas coletadas por coluna

O SelectDB coleta as seguintes estatísticas para cada coluna:

Campo

Descrição

row_count

Número total de linhas

data_size

Tamanho total dos dados

avg_size_byte

Comprimento médio do valor em bytes

ndv

Número de valores distintos

min

Valor mínimo

max

Valor máximo

null_count

Quantidade de valores nulos

Escolha um método de coleta

Dois métodos de coleta estão disponíveis. Escolha com base no tamanho da tabela e nos requisitos de precisão da sua carga de trabalho.

Método

Funcionamento

Compromisso

Coleta completa

Examina a tabela inteira

Maior precisão; maior custo de recursos e mais lento

Coleta por amostragem

Examina um subconjunto de linhas ou uma porcentagem da tabela

Mais rápido e leve em recursos; ligeiramente menos preciso

Para tabelas maiores que 5 GiB, use a coleta por amostragem para evitar tempos limite e uso excessivo de memória no backend (BE).

Colete estatísticas manualmente

Execute a instrução ANALYZE para coletar ou atualizar estatísticas sob demanda.

Sintaxe

ANALYZE < TABLE | DATABASE table_name | db_name >
    [ (column_name [, ...]) ]
    [ [ WITH SYNC ] [ WITH SAMPLE PERCENT | ROWS ] ];

Parâmetros

Parâmetro

Descrição

table_name

Tabela a ser analisada. Use o formato database_name.table_name para especificar o banco de dados.

column_name

Uma ou mais colunas para análise. Separe vários nomes de coluna por vírgulas.

WITH SYNC

Executa a tarefa de forma síncrona e retorna o resultado após a conclusão. Sem essa opção, a tarefa é executada de forma assíncrona e retorna um ID de tarefa.

`WITH SAMPLE PERCENT

ROWS`

Usa a coleta por amostragem. Especifique uma proporção de amostragem (porcentagem) ou um número fixo de linhas.

Exemplos

Colete estatísticas amostrando 10% das linhas:

ANALYZE TABLE lineitem WITH SAMPLE PERCENT 10;

Colete estatísticas amostrando 100.000 linhas:

ANALYZE TABLE lineitem WITH SAMPLE ROWS 100000;

Configure a coleta automática

A coleta automática vem ativada por padrão. Após o commit de cada transação de importação, o SelectDB recalcula a integridade das estatísticas das tabelas afetadas e aciona tarefas de coleta conforme necessário.

Como funciona a pontuação de integridade

A integridade das estatísticas é um valor entre 0 e 100. A coleta automática é acionada quando todas as condições a seguir são atendidas:

  • A tabela foi atualizada desde a última coleta.

  • A pontuação de integridade caiu abaixo do limiar configurado.

  • Para tabelas grandes: o intervalo mínimo de coleta decorreu desde a última coleta.

Detalhes da pontuação de integridade:

  • Uma tabela sem estatísticas tem pontuação de integridade igual a 0.

  • Após cada transação de importação, o SelectDB estima a nova integridade com base na proporção de linhas atualizadas.

  • Se a integridade cair abaixo de table_stats_health_threshold (padrão: 60), a tabela é considerada desatualizada e agendada para coleta.

Estratégia para tabelas grandes

Para tabelas maiores que huge_table_lower_bound_size_in_bytes (padrão: 5 GiB):

  • O SelectDB usa automaticamente a coleta por amostragem, amostrando huge_table_default_sample_rows linhas (padrão: 4.194.304).

  • A coleta é executada no máximo uma vez a cada huge_table_auto_analyze_interval_in_millis (padrão: 12 horas), independentemente das alterações na pontuação de integridade dentro dessa janela.

Para aumentar a profundidade da amostragem e obter estatísticas mais precisas, eleve o valor de huge_table_default_sample_rows.

Limite a coleta a horários de baixa demanda

Para evitar impactos nas cargas de trabalho de produção, defina uma janela de tempo para a coleta automática:

SET auto_analyze_start_time = '02:00:00';
SET auto_analyze_end_time = '06:00:00';

Desative a coleta automática

SET enable_auto_analyze = false;

Catálogo externo

A coleta automática é desativada por padrão para catálogos externos, evitando consumo excessivo de recursos devido a grandes conjuntos de dados históricos. Ative ou desative esse recurso por catálogo:

-- Enable automatic collection for an external catalog
ALTER CATALOG external_catalog SET PROPERTIES ('enable.auto.analyze'='true');

-- Disable automatic collection for an external catalog
ALTER CATALOG external_catalog SET PROPERTIES ('enable.auto.analyze'='false');

Gerencie tarefas de coleta

Visualize tarefas de coleta

SHOW [AUTO] ANALYZE < table_name | job_id >
    [ WHERE [ STATE = [ "PENDING" | "RUNNING" | "FINISHED" | "FAILED" ] ] ];

Parâmetro

Descrição

AUTO

Exibe tarefas históricas de coleta automática. Por padrão, apenas as últimas 20.000 tarefas automáticas concluídas são retidas.

table_name

Filtra por tabela. Use o formato database_name.table_name. Retorna todas as tarefas se omitido.

job_id

Filtra por ID de tarefa. O ID da tarefa é retornado ao executar ANALYZE no modo assíncrono. Retorna todas as tarefas se omitido.

Exemplo:

SHOW ANALYZE 245073\G;
*************************** 1. row ***************************
              job_id: 245073
        catalog_name: internal
             db_name: default_cluster:tpch
            tbl_name: lineitem
            col_name: [l_returnflag,l_receiptdate,l_tax,l_shipmode,l_suppkey,l_shipdate,
                        l_commitdate,l_partkey,l_orderkey,l_quantity,l_linestatus,l_comment,
                        l_extendedprice,l_linenumber,l_discount,l_shipinstruct]
            job_type: MANUAL
       analysis_type: FUNDAMENTALS
             message:
last_exec_time_in_ms: 2023-11-07 11:00:52
               state: FINISHED
            progress: 16 Finished  |  0 Failed  |  0 In Progress  |  16 Total
       schedule_type: ONCE

Campos de saída:

Campo

Descrição

job_id

ID da tarefa

catalog_name

Nome do catálogo

db_name

Nome do banco de dados

tbl_name

Nome da tabela

col_name

Colunas analisadas

job_type

Tipo de tarefa: MANUAL ou AUTO

analysis_type

Tipo de estatística

message

Informações sobre a tarefa de coleta de estatísticas.

last_exec_time_in_ms

Timestamp da última execução

state

Estado da tarefa: PENDING, RUNNING, FINISHED ou FAILED

progress

Detalhamento da conclusão da tarefa

schedule_type

Método de agendamento: ONCE para tarefas únicas

Visualize estatísticas no nível da tabela

SHOW TABLE STATS <table_name>;

Exemplo:

SHOW TABLE STATS lineitem\G
*************************** 1. row ***************************
updated_rows: 0
 query_times: 0
   row_count: 6001215
updated_time: 2023-11-07
     columns: [l_returnflag, l_receiptdate, l_tax, l_shipmode, l_suppkey, l_shipdate,
               l_commitdate, l_partkey, l_orderkey, l_quantity, l_linestatus, l_comment,
               l_extendedprice, l_linenumber, l_discount, l_shipinstruct]
     trigger: MANUAL

Campos de saída:

Campo

Descrição

updated_rows

Número de linhas da tabela atualizadas pela última instrução ANALYZE.

query_times

Reservado; indicará a contagem de consultas em uma versão futura

row_count

Número de linhas da tabela. O valor deste parâmetro não indica o número exato de linhas durante a execução.

updated_time

Data da última atualização das estatísticas

columns

Colunas com estatísticas coletadas

trigger

Forma como a última coleta foi acionada

Visualize o status da tarefa no nível da coluna

Cada tarefa de coleta gera uma subtarefa por coluna. Para visualizar o status das subtarefas de uma tarefa específica:

SHOW ANALYZE TASK STATUS [job_id]

Exemplo:

SHOW ANALYZE TASK STATUS 20038;
+---------+----------+---------+----------------------+----------+
| task_id | col_name | message | last_exec_time_in_ms | state    |
+---------+----------+---------+----------------------+----------+
| 20039   | col4     |         | 2023-06-01 17:22:15  | FINISHED |
| 20040   | col2     |         | 2023-06-01 17:22:15  | FINISHED |
| 20041   | col3     |         | 2023-06-01 17:22:15  | FINISHED |
| 20042   | col1     |         | 2023-06-01 17:22:15  | FINISHED |
+---------+----------+---------+----------------------+----------+

Visualize estatísticas de coluna

SHOW COLUMN [cached] STATS table_name [ (column_name [, ...]) ];

Parâmetro

Descrição

cached

Exibe estatísticas atualmente armazenadas em cache na memória do FE

table_name

Tabela a ser inspecionada. Use o formato database_name.table_name.

column_name

Uma ou mais colunas. Separe vários nomes de coluna por vírgulas.

Exemplo:

SHOW COLUMN STATS lineitem(l_tax)\G
*************************** 1. row ***************************
  column_name: l_tax
        count: 6001215.0
          ndv: 9.0
     num_null: 0.0
    data_size: 4.800972E7
avg_size_byte: 8.0
          min: 0.00
          max: 0.08
       method: FULL
         type: FUNDAMENTALS
      trigger: MANUAL
  query_times: 0
 updated_time: 2023-11-07 11:00:46

Interrompa uma tarefa de coleta

KILL ANALYZE job_id;

O ID da tarefa é retornado pelo comando ANALYZE no modo assíncrono ou obtido através do SHOW ANALYZE.

Exemplo:

KILL ANALYZE 52357;

Variáveis de sessão e itens de configuração do FE

Variáveis de sessão

Variável

Padrão

Descrição

auto_analyze_start_time

00:00:00

Horário de início da janela de coleta automática

auto_analyze_end_time

23:59:59

Horário de término da janela de coleta automática

enable_auto_analyze

true

Ativa ou desativa a coleta automática

huge_table_default_sample_rows

4194304

Número de linhas amostradas para tabelas grandes

huge_table_lower_bound_size_in_bytes

5368709120

Limiar de tamanho acima do qual uma tabela é tratada como grande (padrão: 5 GiB)

huge_table_auto_analyze_interval_in_millis

43200000

Intervalo mínimo entre coletas automáticas para tabelas grandes (padrão: 12 horas)

table_stats_health_threshold

60

Limiar de pontuação de integridade (0–100). Uma tabela é considerada desatualizada quando sua integridade cai abaixo deste valor.

analyze_timeout

43200

Tempo limite para uma tarefa de coleta, em segundos

auto_analyze_table_width_threshold

70

Número máximo de colunas que uma tabela pode ter para participar da coleta automática

Itens de configuração do FE

Estes itens controlam o comportamento em segundo plano. Na maioria dos casos, os padrões são suficientes.

Item de configuração do FE

Padrão

Descrição

analyze_record_limit

20000

Número máximo de registros de execução de tarefas armazenados persistentemente

stats_cache_size

500000

Número máximo de linhas de estatísticas armazenadas em cache no lado do FE

statistics_simultaneously_running_task_num

3

Número máximo de tarefas de coleta assíncronas simultâneas

statistics_sql_mem_limit_in_bytes

2147483648

Memória máxima do BE por instrução SQL usada para coleta (padrão: 2 GiB)

Perguntas frequentes

O erro "Stats table not available..." aparece após executar ANALYZE

Execute SHOW BACKENDS para confirmar se todos os nós BE estão em estado normal. Se os BEs parecerem saudáveis, verifique o status dos tablets da tabela interna de estatísticas:

ADMIN SHOW REPLICA STATUS FROM __internal_schema.[tbl_in_this_db];

Certifique-se de que todos os tablets apresentem status normal. O FE verifica a disponibilidade dos tablets antes de aceitar qualquer solicitação ANALYZE e a rejeita caso algum tablet em __internal_schema.column_statistics esteja indisponível.

A coleta de estatísticas falha em uma tabela grande

Use a coleta por amostragem em vez de uma varredura completa. Os recursos disponíveis para o ANALYZE são estritamente limitados, e uma varredura completa em uma tabela grande pode atingir o tempo limite ou esgotar a memória do BE:

ANALYZE TABLE <table_name> WITH SAMPLE PERCENT 10;

Ajuste a proporção de amostragem com base no tamanho da tabela e na precisão necessária.