Estatísticas do planejador Postgres
O planejador de query do Postgres usa estatísticas do planejador para estimar quantas linhas cada passo de uma query retorna e para escolher um plano de execução. Esta página descreve quando o Postgres gera estatísticas do planejador automaticamente, como encontrar tabelas que não as têm e como alterar o momento em que elas são geradas para uma tabela. Para saber como o Lakebase preserva as estatísticas durante reinicializações do compute e escala para zero, consulte Coleta de estatísticas.
Quando ocorre a execução de ANALYZE em uma tabela?
O autovacuum gera estatísticas do planejador automaticamente ao executar ANALYZE em uma tabela após um número suficiente de linhas ser alterado. Uma tabela é analisada quando o número de linhas inseridas, atualizadas ou excluídas desde a última análise excede:
autovacuum_analyze_threshold + autovacuum_analyze_scale_factor × number of rows in the table
Com as configurações default (autovacuum_analyze_threshold = 50 e autovacuum_analyze_scale_factor = 0.1), uma nova tabela é analisada após mais de 50 linhas serem inseridas, atualizadas ou excluídas, e uma tabela existente após mais de 50 linhas mais 10% de suas linhas mudarem. Como resultado, uma tabela que é carregada uma vez com 50 linhas ou menos e nunca modificada nunca é analisada pelo autovacuum. Sem estatísticas de planejador, o planejador depende de estimativas default, o que pode levar a planos de query ineficientes quando essa tabela é unida a tabelas maiores.
O Databricks recomenda executar ANALYZE em novas tabelas após o carregamento inicial de dados e em tabelas com 50 linhas ou menos (o limite de autoanálise default), de modo que estatísticas precisas do planejador estejam disponíveis antes que as tabelas sejam query.
Analise tabelas particionadas
O autovacuum analisa cada partição de uma tabela particionada à medida que as linhas nessa partição mudam, mas ele nunca analisa a tabela particionada em si (o pai). As estatísticas para o pai descrevem a tabela como um todo e são geradas apenas quando você faz execução de ANALYZE no pai. Sem elas, as queries que referenciam a tabela particionada podem ter planos ineficientes. Faça a execução de ANALYZE no pai depois de carregar dados nele pela primeira vez e novamente sempre que a distribuição de dados entre suas partições mudar significativamente:
ANALYZE my_schema.my_partitioned_table;
Ao fazer a execução de ANALYZE no pai, o Postgres amostra linhas de todas as partições para criar as estatísticas do pai. Por default, ele também analisa cada partição e atualiza as estatísticas da partição, o que pode levar muito tempo em uma tabela grande.
No Postgres 18 e acima, use ANALYZE ONLY para atualizar as estatísticas pai sem analisar cada partição. O Postgres ainda amostra linhas de todas as partições, e o autovacuum continua a analisar as partições à medida que suas linhas mudam.
ANALYZE ONLY my_schema.my_partitioned_table;
No Postgres 16 e 17, ANALYZE em uma tabela particionada sempre analisa todas as partições. Em qualquer versão, para atualizar as estatísticas de uma partição, execute a execução ANALYZE nessa partição.
Localizar tabelas sem estatísticas do planeador
Para encontrar tabelas que não possuem estatísticas de planejador, procure por tabelas sem linhas na view pg_stats. As estatísticas do planejador são armazenadas de forma durável, portanto, esta verificação é confiável mesmo após o Reset das estatísticas cumulativas. A query exclui esquemas de sistema e esquemas que o Lakebase usa internamente para a API de Data e tabelas sincronizadas.
SELECT t.schemaname, t.tablename
FROM pg_tables t
WHERE t.schemaname NOT IN ('pg_catalog', 'information_schema', '__db_system', 'pgrst')
AND t.schemaname NOT LIKE '\_\_db\_user\_%'
AND NOT EXISTS (
SELECT 1 FROM pg_stats s
WHERE s.schemaname = t.schemaname AND s.tablename = t.tablename
)
ORDER BY 1, 2;
Faça a execução da query como um membro da role databricks_superuser ou como o proprietário da tabela. A view pg_stats mostra estatísticas apenas para colunas que a role atual pode ler. Para uma tabela com segurança em nível de linha habilitada, ele também oculta estatísticas, a menos que a role possa ignorar a segurança em nível de linha. Uma tabela que a role atual não pode ler, ou que tem segurança em nível de linha habilitada, pode aparecer nos resultados mesmo se tiver estatísticas.
Tabelas que nunca contiveram dados também aparecem nos resultados, pois o ANALYZE não gera estatísticas para uma tabela vazia. Foque em tabelas que contêm dados e são usadas em queries.
Para gerar estatísticas do planejador para uma tabela retornada pela query, faça a execução de ANALYZE:
ANALYZE my_schema.my_table;
Para analisar cada tabela no banco de dados atual, execução ANALYZE sem um nome de tabela.
Personalizar configurações de autovacuum para uma tabela
Se uma tabela mudar muito raramente em relação aos limites default, você pode diminuir o limite de análise apenas para essa tabela. Por exemplo, para analisar uma pequena tabela de referência após mais de 10 modificações de linha, independentemente do tamanho:
ALTER TABLE my_schema.my_table SET (
autovacuum_analyze_threshold = 10,
autovacuum_analyze_scale_factor = 0
);
Para view as configurações personalizadas em uma tabela, query pg_class.reloptions:
SELECT relname, reloptions
FROM pg_class
WHERE oid = 'my_schema.my_table'::regclass;
Para restaurar o comportamento default, faça o reset das configurações:
ALTER TABLE my_schema.my_table RESET (
autovacuum_analyze_threshold,
autovacuum_analyze_scale_factor
);
Mesmo com um limite menor, o autovacuum não analisa uma tabela se o número de linhas carregadas não exceder o limite e a tabela nunca for modificada depois. Para tabelas estáticas, execução ANALYZE após carregar os dados.
Para obter mais informações, consulte a documentação do Postgres: