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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top