Documentazione di PostgreSQL 9.0 > Il linguaggio SQL > Suggerimenti per migliorare le prestazioni > Statistiche usate dal pianificatore
PrecedenteSuggerimenti per migliorare le prestazioniControllare il pianificatore con clausole JOIN espliciteSuccessivo

14.2. Statistiche usate dal pianificatore

Come abbiamo visto nella sezione precedente, il pianificatore di query ha bisogno di stimare il numero di righe recuperate da una query per prendere buone scelte di piani di query. Questa sezione fornisce un'occhiata veloce alle statistiche che il sistema usa per queste stime.

Un componente delle statistiche è il numero totale di voci in ogni tabella e indice, così come il numero di blocchi del disco occupati da ogni tabella e indice. Questa informazione è mantenuta nella tabella pg_class, nelle colonne reltuples e relpages. È possibile darci un'occhiata con query simili a questa:

SELECT relname, relkind, reltuples, relpages
FROM pg_class
WHERE relname LIKE 'tenk1%';

       relname        | relkind | reltuples | relpages
----------------------+---------+-----------+----------
 tenk1                | r       |     10000 |      358
 tenk1_hundred        | i       |     10000 |       30
 tenk1_thous_tenthous | i       |     10000 |       30
 tenk1_unique1        | i       |     10000 |       30
 tenk1_unique2        | i       |     10000 |       30
(5 rows)

Qui è possibile notare che tenk1 contiene 10000 righe, con i suoi indici, ma gli indici sono (ovviamente) molto più piccoli della tabella.

Per ragioni di efficienza, reltuples e relpages non sono aggiornate al volo, e così di solito contengono valori non aggiornati. Essi sono aggiornati dai comandi VACUUM, ANALYZE e alcuni comandi DDL come CREATE INDEX. Un ANALYZE a sè stante, che non fa parte di VACUUM, genera un valore reltuples approssimato dato che non legge ogni riga della tabella. Il pianificatore bilancierà i valori che trova in pg_class per corrispondere alla dimensione fisica corrente della tabella, ottenendo così un'approssimazione più precisa.

La maggior parte delle query ricava solo una frazione delle righe in una tabella, considerando che le clausole WHERE restringono le righe da esaminare. Il pianificatore perciò deve fare una stima della selettività delle clausole WHERE, cioè la frazione di righe che corrisponde ad ogni condizione nella clausola WHERE. Le informazioni usate per questo compito sono salvate nel catalogo di sistema pg_statistic Le voci in pg_statistic sono aggiornate dai comandi ANALYZE e VACUUM ANALYZE, e sono sempre approssimate anche quando appena aggiornate.

Invece di guardare direttamente in pg_statistic, è preferibile guardare nella sua vista pg_stats quando di esaminano le statistiche manualmente. pg_stats è progettata per essere più facilmente leggibile. Inoltre, pg_stats è leggibile da tutti, mentre pg_statistic è leggibile solo dal superutente. (Questo previene che gli utenti senza privilegi ricavino informazioni sul contenuto delle tabelle degli altri utenti dalle statistiche. La vista pg_stats mostra solo le righe di tabelle che l'utente corrente può leggere). Per esempio, si potrebbe fare:

SELECT attname, inherited, n_distinct,
       array_to_string(most_common_vals, E'\n') as most_common_vals
FROM pg_stats
WHERE tablename = 'road';

 attname | inherited | n_distinct |          most_common_vals          
---------+-----------+------------+------------------------------------
 name    | f         |  -0.363388 | I- 580                        Ramp+
         |           |            | I- 880                        Ramp+
         |           |            | Sp Railroad                       +
         |           |            | I- 580                            +
         |           |            | I- 680                        Ramp
 name    | t         |  -0.284859 | I- 880                        Ramp+
         |           |            | I- 580                        Ramp+
         |           |            | I- 680                        Ramp+
         |           |            | I- 580                            +
         |           |            | State Hwy 13                  Ramp
(2 rows)

Notare che due righe sono visualizzate per la stessa colonna, una corrispondente alla gerarchia di ereditarietà completa cominciando dalla tabella road (inherited=t), e l'altra includendo solo la tabella road stessa (inherited=f).

L'ammontare di informazioni salvate in pg_statistic da ANALYZE, in particolare il massimo numero di voci negli array most_common_vals e histogram_bounds per ogni colonna, può essere impostato in base alla colonna usando il comando ALTER TABLE SET STATISTICS, o globalmente impostando la variabile di configurazione default_statistics_target. Il limite predefinito è attualmente di 100 voci. Incrementare il limite potrebbe permettere strime del pianificatore più accurate, in particolare per colonne con distribuzione dei dati non omogenea, al prezzo di consumare maggiore spazio in pg_statistic e leggermente più tempo per calcolare le stime. Al contrario, un limite più basso potrebbe essere sufficiente per colonne con distribuzione dei dati più semplice.

Ulteriori dettagli sull'uso delle statistiche da parte del pianificatore possono essere trovati in Capitolo 56, How the Planner Uses Statistics.

Documentazione di PostgreSQL 9.0 > Il linguaggio SQL > Suggerimenti per migliorare le prestazioni > Statistiche usate dal pianificatore
PrecedenteSuggerimenti per migliorare le prestazioniControllare il pianificatore con clausole JOIN espliciteSuccessivo