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 |
|
|
Número total de linhas |
|
|
Tamanho total dos dados |
|
|
Comprimento médio do valor em bytes |
|
|
Número de valores distintos |
|
|
Valor mínimo |
|
|
Valor máximo |
|
|
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 |
|
|
|
Tabela a ser analisada. Use o formato |
|
|
|
Uma ou mais colunas para análise. Separe vários nomes de coluna por vírgulas. |
|
|
|
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. |
|
|
|
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_rowslinhas (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 |
|
|
Exibe tarefas históricas de coleta automática. Por padrão, apenas as últimas 20.000 tarefas automáticas concluídas são retidas. |
|
|
Filtra por tabela. Use o formato |
|
|
Filtra por ID de tarefa. O ID da tarefa é retornado ao executar |
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 |
|
|
ID da tarefa |
|
|
Nome do catálogo |
|
|
Nome do banco de dados |
|
|
Nome da tabela |
|
|
Colunas analisadas |
|
|
Tipo de tarefa: |
|
|
Tipo de estatística |
|
|
Informações sobre a tarefa de coleta de estatísticas. |
|
|
Timestamp da última execução |
|
|
Estado da tarefa: |
|
|
Detalhamento da conclusão da tarefa |
|
|
Método de agendamento: |
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 |
|
|
Número de linhas da tabela atualizadas pela última instrução ANALYZE. |
|
|
Reservado; indicará a contagem de consultas em uma versão futura |
|
|
Número de linhas da tabela. O valor deste parâmetro não indica o número exato de linhas durante a execução. |
|
|
Data da última atualização das estatísticas |
|
|
Colunas com estatísticas coletadas |
|
|
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 |
|
|
Exibe estatísticas atualmente armazenadas em cache na memória do FE |
|
|
Tabela a ser inspecionada. Use o formato |
|
|
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 |
|
|
|
Horário de início da janela de coleta automática |
|
|
|
Horário de término da janela de coleta automática |
|
|
|
Ativa ou desativa a coleta automática |
|
|
|
Número de linhas amostradas para tabelas grandes |
|
|
|
Limiar de tamanho acima do qual uma tabela é tratada como grande (padrão: 5 GiB) |
|
|
|
Intervalo mínimo entre coletas automáticas para tabelas grandes (padrão: 12 horas) |
|
|
|
Limiar de pontuação de integridade (0–100). Uma tabela é considerada desatualizada quando sua integridade cai abaixo deste valor. |
|
|
|
Tempo limite para uma tarefa de coleta, em segundos |
|
|
|
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 |
|
|
|
Número máximo de registros de execução de tarefas armazenados persistentemente |
|
|
|
Número máximo de linhas de estatísticas armazenadas em cache no lado do FE |
|
|
|
Número máximo de tarefas de coleta assíncronas simultâneas |
|
|
|
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.