postgresql listesi ve boyuta göre tablo sıralaması


111

Bir PostgreSQL veritabanının tüm tablolarını nasıl listeleyebilir ve boyutlarına göre sıralayabilirim ?


1
Komut satırı psql istemcisini kullanıyorsanız, basit bir \d+şekilde size bu bilgiyi sıralanmamış olsa da gösterecektir.
cdhowie

1
Teşekkürler. Ama sıralanmasına ihtiyacım var, çok fazla masam var.
özel bir şey yok

1
Aynı şeyi ancak tablolar yerine veritabanları arayan insanlar: İşte çözüm .
Skippy le Grand Gourou

1
Re psql: --echo-hidden ile başlayın ve size \ d + ve diğer ters eğik çizgi komutları için yapılan sorguları söyleyecektir. Sıralama eklemek kolaydır.
Jürgen Strobel

Yanıtlar:


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

publicBirden fazla şemanız varsa, bu size şemadaki tüm tabloların boyutunu gösterir , kullanmak isteyebilirsiniz:

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

SQLFiddle örneği: http://sqlfiddle.com/#!15/13157/3

Kılavuzdaki tüm nesne boyutu işlevlerinin listesi .


Bu tablo_seması, şema_adı değil. İlk sorgu iyiydi, ancak zaten psql oturumunuzda bir söz dizimi hatasına neden olan bir şey yazmaya başlamıştınız.
verimsfalsehood

Tamam bu kod çalışıyor: select table_schema, table_name, pg_relation_size(table_schema||'.'||table_name) from information_schema.tables order by 3; yardım için teşekkürler!
özel bir şey yok

Bunun benim durumumda ne işe yaramadığına dair bir fikrin var mı? stackoverflow.com/questions/40977776/…
Juan Carlos Oropeza

@Sucrenoir: "çalışmıyor" geçerli bir Postgres hata mesajı değil. Cevabımdaki
a_horse_with_no_name

İlk sorguyu çalıştırdığımda sıfır satır alıyorum. şemayı herkese açık olarak select * from information_schema.tables where table_schema = 'public';gösterse bile sıfır satır verir \dn. Belki 9.5'teki bir değişiklik buna neden oldu?
çoban köpeği

75

Bu size şema adını, tablo adını, boyutu ve boyutunu (sıralama için gerekli) gösterecektir.

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;

Bunu , bir PostgreSQL veritabanındaki boyutları (göreli ve mutlak) içeren şema listesindeki çözümlere dayanarak oluşturuyorum


21

Bu daha net olacak.

pg_size_pretty(<numeric_value>) - bayt sayısını insan tarafından okunabilir biçime dönüştürür.

pg_database_size(<db_name>)- bayt cinsinden veritabanı boyutunu alır .

pg_total_relation_size(<relation_name>)- tablonun toplam boyutunu ve bayt cinsinden indeksini alır .

pg_relation_size(<relation_name>)- bayt cinsinden ilişki (tablo / dizin) boyutunu alır .

pg_index_size(<relation_name>)- dizin boyutunu alır ilişki içinde bayt .

current_database() - Bu sorgunun gerçekleştirildiği şu anda kullanılan veritabanını alır.

Sorgu:

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;

Sonuç:

 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

İnsana uygun formatta temsil edilir bytes, kB, MB, GB, ve TB.

bytesiçin kB- dan başlar10240 bytes

bytesiçin MB- başlar 10485248 bytes= 10239.5 kB~10 MB

bytesiçin GB- başlar 10736893952 bytes= 10239.5 MB~10 BG

bytesiçin TB- başlar 10994579406848 bytes= 10239.5 GB~10 TB

Tüm birim dönüşümleri başlar 10 + <unit>.

Referans için - Postgres Resmi Belgeleri


Bu örnek büyük tablo isimleriyle çalışmaz
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

Başka bir alternatif


2

Hangi masaların en fazla alanı kullandığını bulmam gerekiyordu.

Diğer yanıtlara göre şu sorguyu kullandım:

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

Aşağıdaki sonucu alıyorum:

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

Daha büyük bir SSD almalıydım.


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

1
Önerilen yaklaşımın neden yararlı olduğuna dair bir açıklama eklerseniz cevabınız daha değerli olacaktır.
Cindy Meister

Atın cevabına benzer, sadece boyuta göre sıralama yapmak, çünkü sıralama görünümü kolay görünecektir.
Spike

Lütfen bu metni "Cevap" alanındaki Düzenle bağlantısını kullanarak Cevabınıza ekleyin. O zaman katkınız StackOverflow yönergelerine uygun olacaktır (Yardım Merkezinde biraz okuyun) :-)
Cindy Meister
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.