1. Glossario/

default_statistics_target

default_statistics_target (PostgreSQL)

default_statistics_target è il parametro PostgreSQL che definisce il numero di campioni raccolti dal comando ANALYZE per costruire le statistiche di ogni colonna. Il valore di default è 100.

Come funziona #

PostgreSQL campiona un certo numero di valori per ogni colonna e li usa per costruire due strutture:

  • Most common values (MCV): la lista dei valori più frequenti, con le rispettive frequenze
  • Istogramma: la distribuzione dei valori rimanenti, divisa in bucket di uguale popolazione

Il parametro default_statistics_target determina quanti elementi avranno queste strutture. Con il valore 100 (default), l’istogramma avrà 100 bucket e la lista MCV conterrà fino a 100 valori.

Quando aumentarlo #

Per tabelle piccole o con distribuzione uniforme, 100 campioni sono sufficienti. Per tabelle grandi con distribuzione asimmetrica (skewed) — dove pochi valori dominano la maggior parte delle righe — 100 campioni possono dare una rappresentazione distorta, portando l’optimizer a stime di cardinalità sbagliate.

Si può aumentare il target a livello di singola colonna:

ALTER TABLE orders ALTER COLUMN status SET STATISTICS 500;
ANALYZE orders;

Valori tra 500 e 1000 migliorano sensibilmente la qualità delle stime su colonne con distribuzione non uniforme.

Limiti pratici #

Oltre 1000 il beneficio è marginale e l’ANALYZE stesso diventa più lento, perché deve campionare più righe e costruire strutture più grandi. È una regolazione fine: va applicata solo alle colonne che effettivamente causano stime errate, non a tutte le colonne di tutte le tabelle.