2017-09-28 6 views
1

J'essaie d'obtenir des statistiques sur les index. Je cherche des valeurs totales dans un index et sa taille. Je peux seulement trouver la taille de tous les index sur la table. La table pg_class column relpages et reluples affiche les valeurs de la table et non le niveau d'index spécifique.Taille de l'index et numéro de valeur de PostgreSQL

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

Y at-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

+0

'pg_stat_all_indexes'? .. –

+0

pg_stat_all_indexes affiche des statistiques que sur lecture/fetch/scan et non la taille réelle et le nombre de valeurs dans l'indice –

+0

oui, et' pg_indexes_size' que vous mentionnez montre les indices de taille prennent sur le disque, pas la "quantité réelle de données" - je pensais que vous êtes d'accord avec une approximation? :) –

Répondre

1

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

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

sum(pg_column_size(column_name)) from table_name pour les estimations sur les données colonne quantité

vous pouvez vous essayer SMTH 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 de vérifier comment psql obtient la taille de l'index individuel, exécutez avec psql -E ..

et encore une fois - les fonctions ci-dessus travail avec la taille il faut du disque - il peut/(ne peut pas) être extrimely différent à partir 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 » de l'indice, peut ainsi offrir que de 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 où la clause pour cela) en vérifiant le rows=66800 en Index Only Scan using me donne une idée sur le nombre de lignes dans cet index (en fait c'est rows=64910 que vous pouvez obtenir par explain analyze ou en cours d'exécution count(1)) . Je ne trouve pas d'informations pertinentes dans pg_stats - il y a peut-être une formule ... non.

+0

Vao Tsun, Merci beaucoup pour votre réponse, mais peut-être que je ne comprends pas complètement . Je cours ce qui suit: créer la table stg.test_index_size en tant que choisir t.id, cas quand t.id <25000 alors 'petit' sinon 'haut' fin comme indicateur de generate_series (1,50000) en tant que t (id); créer un index unique idx_id sur stg.test_index_size (id); create index idx_flag sur stg.test_index_size (indicateur); analyse de vide stg.test_index_size; Maintenant, quand je vérifie la taille des deux index avec pg_table_size (quote_ident (indexrelname) :: text), j'obtiens le même résultat. Je m'attendais à ce que l'index des drapeaux soit plus petit –

+0

point juste en ce qui concerne la table stat - réponse éditée - merci.en ce qui concerne l'autre - mieux vaut poser une nouvelle question je suppose –

+0

Aussi pg_stat_all_indexes n'affiche pas le numéro de ligne estimé de l'index mais plutôt seulement idx_scan, idx_tup_read et idx_tup_fetch. Je m'attends à obtenir idx_id 50000 et idx_flag = 2 –