postgresql Liste und Reihenfolge Tabellen nach Größe

108

Wie kann ich alle Tabellen einer PostgreSQL-Datenbank auflisten und nach Größe sortieren ?

nichts Besonderes hier
quelle
1
Wenn Sie den Befehlszeilen-PSQL-Client verwenden, \d+werden Ihnen diese Informationen in einem einfachen Code angezeigt , obwohl sie unsortiert sind.
CDhowie
1
Vielen Dank. Aber ich muss es sortieren, ich habe zu viele Tabellen.
nichts Besonderes-hier
1
Leute, die das Gleiche suchen, aber nach Datenbanken statt nach Tabellen: Hier ist die Lösung .
Skippy le Grand Gourou
1
Zu psql: starte es mit --echo-hidden und es werden dir die Abfragen angezeigt, die für \ d + und andere Backslash-Befehle ausgeführt wurden. Einfache Sortierung hinzuzufügen.
Jürgen Strobel

Antworten:

149
select table_name, pg_relation_size(quote_ident(table_name))
from information_schema.tables
where table_schema = 'public'
order by 2

Dies zeigt Ihnen die Größe aller Tabellen im Schema, publicwenn Sie mehrere Schemas haben, die Sie möglicherweise verwenden möchten:

select table_schema, table_name, pg_relation_size('"'||table_schema||'"."'||table_name||'"')
from information_schema.tables
order by 3

SQLFiddle-Beispiel: http://sqlfiddle.com/#!15/13157/3

Liste aller Objektgrößenfunktionen im Handbuch .

ein Pferd ohne Name
quelle
Es ist table_schema, nicht schema_name. Die erste Abfrage war in Ordnung, aber Sie hatten bereits begonnen, etwas in Ihre psql-Sitzung einzugeben, was zu einem Syntaxfehler führte.
Ertragslücke
OK, dieser Code funktioniert: select table_schema, table_name, pg_relation_size(table_schema||'.'||table_name) from information_schema.tables order by 3; Danke für die Hilfe!
nichts Besonderes-hier
Irgendeine Idee, was das in meinem Fall nicht funktioniert? stackoverflow.com/questions/40977776/…
Juan Carlos Oropeza
@Sucrenoir: "funktioniert nicht" ist keine gültige Postgres-Fehlermeldung. Die Abfrage in meiner Antwort funktioniert für mich: rextester.com/KGKPR49004
a_horse_with_no_name
Ich erhalte null Zeilen, wenn ich die erste Abfrage ausführe. select * from information_schema.tables where table_schema = 'public';liefert null Zeilen, obwohl \dndas Schema public angezeigt wird. Vielleicht hat eine Änderung in 9.5 dies verursacht?
Schäferhund
71

Dies zeigt Ihnen den Schemanamen, den Tabellennamen, die hübsche Größe und die Größe (für die Sortierung erforderlich).

SELECT
  schema_name,
  relname,
  pg_size_pretty(table_size) AS size,
  table_size

FROM (
       SELECT
         pg_catalog.pg_namespace.nspname           AS schema_name,
         relname,
         pg_relation_size(pg_catalog.pg_class.oid) AS table_size

       FROM pg_catalog.pg_class
         JOIN pg_catalog.pg_namespace ON relnamespace = pg_catalog.pg_namespace.oid
     ) t
WHERE schema_name NOT LIKE 'pg_%'
ORDER BY table_size DESC;

Ich erstelle dies basierend auf den Lösungen aus dieser Liste von Schemas mit Größen (relativ und absolut) in einer PostgreSQL-Datenbank

Kuchi
quelle
21

Dies wird klarer.

pg_size_pretty(<numeric_value>) - Konvertiert die Anzahl der Bytes in ein lesbares Format.

pg_database_size(<db_name>)- Ruft die Datenbankgröße in Bytes ab .

pg_total_relation_size(<relation_name>)- Ruft die Gesamtgröße der Tabelle und ihren Index in Bytes ab .

pg_relation_size(<relation_name>)- Ruft die Größe der Beziehung (Tabelle / Index) in Bytes ab .

pg_index_size(<relation_name>)- Ruft die Indexgröße der Beziehung in Bytes ab .

current_database() - Ruft die aktuell verwendete Datenbank ab, für die diese Abfrage ausgeführt wird.

Abfrage:

select current_database() as database,
       pg_size_pretty(total_database_size) as total_database_size,
       schema_name,
       table_name,
       pg_size_pretty(total_table_size) as total_table_size,
       pg_size_pretty(table_size) as table_size,
       pg_size_pretty(index_size) as index_size
       from ( select table_name,
                table_schema as schema_name,
                pg_database_size(current_database()) as total_database_size,
                pg_total_relation_size(table_name) as total_table_size,
                pg_relation_size(table_name) as table_size,
                pg_indexes_size(table_name) as index_size
                from information_schema.tables
                where table_schema=current_schema() and table_name like 'table_%'
                order by total_table_size
            ) as sizes;

Ergebnis:

 database  | total_database_size | schema_name | table_name | total_table_size | table_size | index_size
-----------+---------------------+-------------+------------+------------------+------------+------------
 vigneshdb | 1586 MB             | corpdata    | table_aaa  | 16 kB            | 0 bytes    | 8192 bytes
 vigneshdb | 1586 MB             | corpdata    | table_bbb  | 24 kB            | 0 bytes    | 16 kB
 vigneshdb | 1586 MB             | corpdata    | table_ccc  | 640 kB           | 112 kB     | 488 kB
 vigneshdb | 1586 MB             | corpdata    | table_ddd  | 9760 kB          | 3152 kB    | 6568 kB
 vigneshdb | 1586 MB             | corpdata    | table_eee  | 1120 MB          | 311 MB     | 808 MB

Das humanisierte Format repräsentiert in bytes, kB, MB, GB, und TB.

byteszu kB- beginnt von10240 bytes

byteszu MB- beginnt von 10485248 bytes= 10239.5 kB~10 MB

byteszu GB- beginnt von 10736893952 bytes= 10239.5 MB~10 BG

byteszu TB- beginnt von 10994579406848 bytes= 10239.5 GB~10 TB

Alle Einheitenumrechnungen beginnen ab 10 + <unit>.

Als Referenz - Offizielle Dokumentation von Postgres

Vignesh Raja
quelle
Dieses Beispiel funktioniert nicht mit Großbuchstaben
Ivan
4
select table_name,n_live_tup, pg_size_pretty(pg_relation_size(table_name))
from information_schema.tables
inner join pg_stat_user_tables  on table_name=relname
where table_schema = 'public'
order by 2 desc

Eine andere Alternative

Lauri Lüüs
quelle
2

Ich musste herausfinden, welche Tabellen den meisten Platz beanspruchen.

Basierend auf anderen Antworten habe ich diese Abfrage verwendet:

select table_name, pg_size_pretty( pg_relation_size(quote_ident(table_name)) )
from information_schema.tables
where table_schema = 'public'
order by pg_relation_size(quote_ident(table_name)) desc

Ich erhalte folgendes Ergebnis:

table_name              pg_size_pretty
--------------------------------------
trade_binance           96 GB
closs_v2_binance_stash  46 GB
closs_bitfinex_stash    5725 MB
trade_bitfinex          5112 MB
...
api_requests            0 bytes
trade_huobi             0 bytes

Ich hätte eine größere SSD kaufen sollen.

Benjamin Crouzier
quelle
1
 select uv.a tablename, pg_size_pretty(uv.b) sizepretty 
 from (select tb.tablename a, pg_table_size('schemaname.'||tb.tablename::text) b 
        from pg_tables tb 
        where tb.schemaname ilike 'schemaname' 
        order by 2 desc
       ) uv
Spitze
quelle
1
Ihre Antwort wäre wertvoller, wenn Sie eine Erklärung hinzufügen, warum der vorgeschlagene Ansatz hilfreich ist.
Cindy Meister
Es ähnelt der Antwort des Pferdes, nur das Sortieren nach Größe mit hübsch, da die Sortieransicht leicht zu sehen ist.
Spike
Bitte fügen Sie diesen Text Ihrer Antwort hinzu, indem Sie den Link Bearbeiten im Bereich "Antwort" verwenden. Dann entspricht Ihr Beitrag den StackOverflow-Richtlinien (lesen Sie ein wenig in der Hilfe) :-)
Cindy Meister