mercoledì 29 ottobre 2008

Explain su tabella vuote

Mi sono accorto per caso, preparando le slide del LinuxDay 2008, che l'EXPLAIN di PostgreSQL si comporta in modo strano quando la tabella è vuota.
Ad esempio:

# create table test(id serial, descrizione character varying(20));

# explain select * from test;
QUERY PLAN
--------------------------------------------------------
Seq Scan on test (cost=0.00..18.80 rows=880 width=62)

# analyze verbose test;
INFO: analyzing "public.test"
INFO: "test": scanned 0 of 0 pages, containing 0 live rows and 0 dead rows; 0
rows in sample, 0 estimated total rows
ANALYZE

# explain select * from test;
QUERY PLAN
--------------------------------------------------------
Seq Scan on test ?(cost=0.00..18.80 rows=880 width=62)
(1 row)

# select count(*) from test;
count
-------
0
(1 row)

quindi la tabella è vuota, e anche se ci si esegue un ANALYZE su di essa, l'ottimizzatore continua a sostenere che 880 righe possono essere ottenute da essa. Mi sono poi accorto che nel caso di tabella vuota non viene inserita nessuna statistica in pg_stats, e quindi l'ottimizzatore non ha modo di capire che la tabella sia vuota (o meglio potrebbe capirlo solo dal fatto che non esiste una statistica in pg_stats, ma questo può anche ricondurre ad un caso di tabella non analizzata). L'ottimizzatore tenta quindi di fare una stima delle tuple che potrebbe essere contenute nella tabella, dipendentemente dalla dimensione della pagina dati e dalla dimensione della tupla stessa.

Nessun commento: