postgresql-come e perché gli indici sono più grandi delle loro tabelle
-
26-09-2020 - |
Domanda
Sto usando postgresql 9.3 e sto cercando di capire come e perché gli indici sono più grandi delle loro tabelle.
Uscita del campione:
database_name | database_size | table_name | table_size | indexes_size | total_size
---------------+---------------+--------------------------------------------------------------+------------+--------------+------------
foo_12345 | 412 MB | "foobar_dev_12345"."fact_mobile_sends" | 57 MB | 131 MB | 189 MB
foo_12345 | 412 MB | "foobar_dev_12345"."fact_mobile_started" | 17 MB | 39 MB | 56 MB
foo_12345 | 412 MB | "foobar_dev_12345"."fact_mobile_stopped" | 16 MB | 35 MB | 51 MB
Sto eseguendo la seguente query per ottenere le dimensioni della tabella e dell'indice.
SELECT
table_catalog AS database_name,
pg_size_pretty(pg_database_size(current_database())) As database_size,
table_name,
pg_size_pretty(table_size) AS table_size,
pg_size_pretty(indexes_size) AS indexes_size,
pg_size_pretty(total_size) AS total_size
FROM (
SELECT
table_catalog,
pg_database_size(current_database()) AS database_size,
table_name,
pg_table_size(table_name) AS table_size,
pg_indexes_size(table_name) AS indexes_size,
pg_total_relation_size(table_name) AS total_size
FROM (
SELECT ('"' || table_schema || '"."' || table_name || '"') AS table_name, table_catalog
FROM information_schema.tables
) AS all_tables
ORDER BY total_size DESC
) AS pretty_sizes;
La mia domanda è corretta?Cosa farebbe sì che gli indici siano più grandi?
Soluzione
Possibili ragioni:
Numerosi e probabilmente sovrapposti indici sul tavolo;dai un'occhiata con
\d
Il gonfiore dovuto all'elevato tasso di abbandono degli aggiornamenti può talvolta influenzare gli indici più delle tabelle, a seconda dei modelli di aggiornamento.Esaminare la dimensione di ogni singolo indice per vedere se ha senso.
Gli indici GiST, se usati, possono essere abbastanza grandi
A differenza di quello che pensavo inizialmente questo è non un problema con TOAST
storage out-of-line non viene conteggiato, dal momento che pg_table_size
includere TOAST
tavolo.
Si noti che se siete preoccupati per indice gonfiare e decidere di REINDEX
alcuni di tutti gli indici coinvolti, considerare l'impostazione di un non-default FILLFACTOR
innanzitutto se la tabella è soggetta a molti aggiornamenti (o inserti+eliminazioni).Altrimenti prenderai un colpo di prestazioni in scrittura perché l'indice non ha spazio per inserire nuovi valori, quindi forzerà molte divisioni di pagina e sarà strutturato in modo meno efficiente.