web-dev-qa-db-fra.com

Taille et numéro d'index de PostgreSQL

J'essaie d'obtenir des statistiques sur les index. Je recherche des valeurs totales dans un index et sa taille.

Je ne peux trouver que la taille de tous les index sur la table. La table pg_class colonne relpages et reltuples affiche les valeurs de la table et non à un niveau d'index spécifique.

De plus, la fonction pg_indexes_size prend le nom de la table comme argument et renvoie la taille totale de l'index pour cette table.

existe-t-il un moyen d'obtenir la taille et le numéro de ligne au niveau de l'index? J'utilise PostgreSQL 9.3.

Merci d'avance pour votre aide

8
oved_s

pg_table_size('index_name') pour l'index individuel - mais il ne vous montrera que la taille sur le disque, pas la quantité de données

count(1) pour obtenir le montage actuel exact des lignes

sum(pg_column_size(column_name)) from table_name pour les estimations du montant des données de la colonne

vous pouvez vous essayer comme:

t=# \di+ tbl*
                                    List of relations
 Schema |         Name         | Type  |  Owner   |     Table      |  Size  | Description
--------+----------------------+-------+----------+----------------+--------+-------------
 public | tbl_pkey  | index | postgres | tbl | 156 MB |
 public | tbl_unpic | index | postgres | tbl | 46 MB  |
 public | tbl_x1    | index | postgres | tbl | 57 MB  |
(3 rows)

t=# \dt+ tbl
                        List of relations
 Schema |      Name      | Type  |  Owner   | Size  | Description
--------+----------------+-------+----------+-------+-------------
 public | tbl | table | postgres | 78 MB |
(1 row)

t=# select pg_size_pretty(pg_total_relation_size('tbl'));
 pg_size_pretty
----------------
 337 MB
(1 row)

t=# select 78+57+46+156;
 ?column?
----------
      337
(1 row)

et pour vérifier comment psql obtient la taille d'index individuelle, exécutez-la avec psql -E ..

et encore une fois - les fonctions ci-dessus fonctionnent avec la taille qu'il faut du disque - cela peut/(peut-être) être extrêmement différent de la quantité réelle de données. passer l'aspirateur aide ici

mise à jour Je ne sais pas où vous obtenez directement le nombre de "lignes" dans l'index, donc je ne peux offrir qu'une manière indirecte. Par exemple, laissez-moi avoir un index partiel, donc "nombre de lignes" est différent de la table. Je peux vérifier les estimations avec EXPLAIN (bien sûr, vous devez répéter la clause where pour cela) vérifier le rows=66800 Dans Index Only Scan using Me donne une idée du nombre de lignes dans cet index (en fait c'est rows=64910 Que vous pouvez obtenir par explain analyze Ou simplement en exécutant count(1)). Je ne trouve pas d'informations pertinentes dans pg_stats - il y a peut-être une formule ... ne sais pas.

14
Vao Tsun