daftar postgresql dan tabel urutan berdasarkan ukuran

109

Bagaimana cara mendaftar semua tabel database PostgreSQL dan mengurutkannya berdasarkan ukurannya ?

tidak ada yang istimewa di sini
sumber
1
Jika Anda menggunakan klien baris perintah psql maka simple \d+akan menampilkan informasi ini, meskipun tidak disortir.
cdhowie
1
Terima kasih. Tapi saya membutuhkannya diurutkan, saya memiliki terlalu banyak tabel.
tidak ada yang istimewa-di sini
1
Orang-orang mencari hal yang sama tetapi untuk database, bukan tabel: inilah solusinya .
Skippy le Grand Gourou
1
Re psql: mulai dengan --echo-hidden dan ini akan memberi tahu Anda kueri yang dilakukan untuk \ d + dan perintah backslash lainnya. Mudah untuk menambahkan penyortiran.
Jürgen Strobel

Jawaban:

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

Ini menunjukkan kepada Anda ukuran semua tabel di skema publicjika Anda memiliki beberapa skema, Anda mungkin ingin menggunakan:

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

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

Daftar semua fungsi ukuran objek di manual .

seekor kuda tanpa nama
sumber
Ini table_schema, bukan schema_name. Kueri pertama baik-baik saja tetapi Anda sudah mulai mengetik sesuatu di sesi psql Anda, yang menyebabkan kesalahan sintaks.
menghasilkan kebohongan
OK kode ini berfungsi: select table_schema, table_name, pg_relation_size(table_schema||'.'||table_name) from information_schema.tables order by 3; terima kasih atas bantuannya!
tidak ada yang istimewa-di sini
tahu apa ini tidak berhasil dalam kasus saya? stackoverflow.com/questions/40977776/…
Juan Carlos Oropeza
@Sucrenoir: "tidak berfungsi" bukanlah pesan kesalahan Postgres yang valid. Kueri dalam jawaban saya berhasil untuk saya: rextester.com/KGKPR49004
a_horse_with_no_name
Saya mendapatkan nol baris saat menjalankan kueri pertama. select * from information_schema.tables where table_schema = 'public';menghasilkan nol baris meskipun \dnmenunjukkan skema publik. Mungkin perubahan 9,5 menyebabkan ini?
anjing gembala
71

Ini akan menunjukkan kepada Anda nama skema, nama tabel, ukuran cantik dan ukuran (diperlukan untuk pengurutan).

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;

Saya membangun ini berdasarkan solusi dari daftar skema dengan ukuran (relatif dan absolut) di database PostgreSQL di sini

Kuchi
sumber
21

Ini akan lebih jelas.

pg_size_pretty(<numeric_value>) - mengubah jumlah byte ke format yang dapat dibaca manusia.

pg_database_size(<db_name>)- mendapat ukuran database dalam byte .

pg_total_relation_size(<relation_name>)- mendapatkan ukuran total tabel dan indeksnya dalam byte .

pg_relation_size(<relation_name>)- mendapat ukuran hubungan (tabel / indeks) dalam byte .

pg_index_size(<relation_name>)- mendapat ukuran indeks dari relasi dalam byte .

current_database() - mendapatkan database yang sedang digunakan untuk menjalankan kueri ini.

Pertanyaan:

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;

Hasil:

 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

Format manusiawi yang mewakili dalam bytes, kB, MB, GB, danTB .

bytes untuk kB - dimulai dari10240 bytes

byteske MB- dimulai dari 10485248 bytes=10239.5 kB ~10 MB

byteske GB- dimulai dari 10736893952 bytes=10239.5 MB ~10 BG

byteske TB- dimulai dari 10994579406848 bytes=10239.5 GB ~10 TB

Semua konversi unit dimulai dari 10 + <unit> .

Untuk referensi - Dokumentasi Resmi Postgres

Vignesh Raja
sumber
Contoh ini tidak berfungsi dengan nama tabel huruf besar
Ivan Sveshnikov
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

Alternatif lain

Lauri Lüüs
sumber
2

Saya perlu menemukan tabel mana yang paling banyak menggunakan ruang.

Berdasarkan jawaban lain, saya menggunakan kueri itu:

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

Saya mendapatkan hasil sebagai berikut:

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

Saya seharusnya membeli SSD yang lebih besar.

Benjamin Crouzier
sumber
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
Paku
sumber
1
Jawaban Anda akan lebih berharga jika Anda menyertakan penjelasan mengapa pendekatan yang disarankan bermanfaat.
Cindy Meister
Mirip dengan jawaban kuda, hanya melakukan sortir menurut ukuran dengan cantik karena tampilan sortir akan mudah dilihat.
Lonjakan
Harap tambahkan teks itu ke Jawaban Anda, menggunakan tautan Edit di ruang "Jawab". Kemudian kontribusi Anda akan sesuai dengan pedoman StackOverflow (baca sedikit di Pusat Bantuan) :-)
Cindy Meister