Statistiche del pianificatore Postgres

Il pianificatore di query Postgres utilizza le statistiche del planner per stimare quante righe ogni passaggio di una query restituisce e per scegliere un piano di esecuzione. Questa pagina descrive quando Postgres genera automaticamente le statistiche del planner, come trovare le tabelle che le hanno mancanti e come modificare quando vengono generate per una tabella. Per informazioni su come Lakebase preserva le statistiche durante i riavvii di calcolo e la scalabilità fino a zero, vedi Raccolta delle statistiche.

Quando viene eseguito ANALYZE su una tabella?

Autovacuum genera automaticamente statistiche di planner eseguendo ANALYZE su una tabella dopo che cambiano abbastanza righe. Una tabella viene analizzata quando il numero di righe inserite, aggiornate o eliminate dall'ultima analisi supera:

autovacuum_analyze_threshold + autovacuum_analyze_scale_factor × number of rows in the table

Con le impostazioni predefinite (autovacuum_analyze_threshold = 50 e autovacuum_analyze_scale_factor = 0.1), una nuova tabella viene analizzata dopo che più di 50 righe sono state inserite, aggiornate o eliminate, e una tabella esistente dopo che cambiano più di 50 righe più il 10% delle sue righe. Di conseguenza, una tabella caricata una volta con 50 o meno righe e mai modificata non viene mai analizzata da autovacuum. Senza le statistiche del planner, il planner si affida a stime predefinite, che possono portare a piani di query inefficienti quando quella tabella viene unita a tabelle più grandi.

Databricks raccomanda di eseguire ANALYZE su nuove tabelle dopo il caricamento iniziale dei dati e su tabelle con 50 o meno righe (la soglia predefinita di autoanalisi), in modo che le statistiche accurate del pianificatore siano in atto prima che le tabelle vengano interrogate.

Analizza le tabelle partizionate

Autovacuum analizza ogni partizione di una tabella partizionata man mano che le righe di quella partizione cambiano, ma non analizza mai la tabella partizionata stessa (il genitore). Le statistiche per il genitore descrivono la tabella nel suo insieme, e vengono generate solo quando si esegue ANALYZE sul genitore. Senza di essi, le query che fanno riferimento alla tabella partizionata possono ottenere piani inefficienti. Esegui ANALYZE sul genitore dopo avervi caricato i dati, e di nuovo ogni volta che la distribuzione dei dati tra le sue partizioni cambia significativamente:

ANALYZE my_schema.my_partitioned_table;

Quando esegui ANALYZE sul genitore, Postgres campiona righe da tutte le partizioni per costruire le statistiche del genitore. Di default, analizza anche ogni partizione e aggiorna le statistiche della partizione, il che può richiedere molto tempo su una tabella grande.

In Postgres 18 e superiori, si usa ANALYZE ONLY per aggiornare le statistiche della partizione padre senza analizzare ogni partizione. Postgres continua a campionare le righe di tutte le partizioni, e l'autovacuum continua ad analizzare le partizioni man mano che le loro righe cambiano.

ANALYZE ONLY my_schema.my_partitioned_table;

In Postgres 16 e 17, ANALYZE su una tabella partizionata analizza sempre tutte le partizioni. In qualsiasi versione, per aggiornare le statistiche di una partizione, esegui ANALYZE su quella partizione.

Trova tabelle senza statistiche del planner

Per trovare tabelle che non hanno statistiche del planner, cerca tabelle senza righe nella vista pg_stats. Le statistiche del planner sono memorizzate in modo duraturo, quindi questo controllo è affidabile anche dopo il reset delle statistiche cumulative. La query esclude gli schemi di sistema e gli schemi che Lakebase utilizza internamente per l'API dati e le tabelle sincronizzate.

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;

Esegui la query come membro del databricks_superuser ruolo o come proprietario della tabella. La pg_stats visualizzazione mostra le statistiche solo per le colonne che il ruolo attuale può leggere. Per una tabella con la sicurezza a livello di riga attivata, nasconde anche le statistiche a meno che il ruolo non possa bypassare la sicurezza a livello riga. Una tabella che il ruolo attuale non può leggere, o che ha la sicurezza a livello di riga attivata, può apparire nei risultati anche se contiene statistiche.

Tabelle che non hanno mai contenuto dati compaiono anche nei risultati, perché ANALYZE non genera statistiche per una tabella vuota. Concentrati sulle tabelle che contengono dati e vengono utilizzate nelle query.

Per generare statistiche del planner per una tabella restituita dalla query, esegui:ANALYZE

ANALYZE my_schema.my_table;

Per analizzare ogni tabella nel database corrente, esegui ANALYZE senza un nome di tabella.

Personalizza le impostazioni di autovacuum per una tabella

Se una tabella cambia troppo raramente rispetto alle soglie predefinite, puoi abbassare la soglia di analisi solo per quella tabella. Ad esempio, per analizzare una piccola tabella di riferimento dopo più di 10 modifiche di righe indipendentemente dalla sua dimensione:

ALTER TABLE my_schema.my_table SET (
  autovacuum_analyze_threshold = 10,
  autovacuum_analyze_scale_factor = 0
);

Per visualizzare le impostazioni personalizzate su una tabella, consulta pg_class.reloptions:

SELECT relname, reloptions
FROM pg_class
WHERE oid = 'my_schema.my_table'::regclass;

Per ripristinare il comportamento predefinito, resetta le impostazioni:

ALTER TABLE my_schema.my_table RESET (
  autovacuum_analyze_threshold,
  autovacuum_analyze_scale_factor
);

Anche con una soglia più bassa, l'autovacuum non analizza una tabella se il numero di righe caricate non supera la soglia e la tabella non viene mai modificata successivamente. Per le tabelle statiche, esegui ANALYZE dopo aver caricato i dati.

Per maggiori informazioni, consulta la documentazione Postgres: