web-dev-qa-db-ja.com

postgresqlのリストとサイズによるテーブルの順序付け

PostgreSQLデータベースのすべてのテーブルをリストし、サイズで並べ替える簡単な方法はありますか?

擬似コード

SELECT * FROM tables
ORDER by tables.size

PostgreSQL9.3.2を使用しています。

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

これは、スキーマpublic内のすべてのテーブルのサイズを示します。複数のスキーマがある場合は、次を使用できます。

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

SQLFiddleの例: http://sqlfiddle.com/#!15/13157/

マニュアル内のすべてのオブジェクトサイズ関数のリスト:
https://www.postgresql.org/docs/current/static/functions-admin.html#FUNCTIONS-ADMIN-DBSIZE

99

これにより、スキーマ名、テーブル名、きれいなサイズ、およびサイズ(ソートに必要)が表示されます。

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;

私はここからのソリューションに基づいてこれを構築します PostgreSQLデータベースのサイズ(相対および絶対)のスキーマのリスト

54
Kuchi

これはより明確になります。

pg_size_pretty(<numeric_value>)-バイト数を人間が読める形式に変換します。

pg_database_size(<db_name>)-bytesでデータベースサイズを取得します。

pg_total_relation_size(<relation_name>)-テーブルとそのインデックスの合計サイズをbytesで取得します。

pg_relation_size(<relation_name>)-bytesの関係サイズを取得します。

pg_index_size(<relation_name>)-relationのインデックスサイズをbytesで取得します。

current_database()-このクエリが実行されている現在使用されているデータベースを取得します。

クエリ:

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;

結果:

 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

人間化された形式は、byteskBMBGB、およびTBで表されます。

byteskB-10240 bytesから始まる

bytesからMB-10485248 bytes = 10239.5 kB10 MBで始まる

bytesからGB-10736893952 bytes = 10239.5 MB10 BGで始まる

bytesからTB-10994579406848 bytes = 10239.5 GB10 TBで始まる

すべての単位変換は10 + <unit>から始まります。

参考- Postgres公式ドキュメント

11
Vignesh Raja
SELECT
   relname as "Table",
   pg_size_pretty(pg_total_relation_size(relid)) As "Size",
   pg_size_pretty(pg_total_relation_size(relid) - pg_relation_size(relid)) as "External Size"
   FROM pg_catalog.pg_statio_user_tables ORDER BY pg_total_relation_size(relid) DESC;

ここから https://wiki-bsse.ethz.ch/display/ITDOC/Check+size+of+tables+and+objects+in+PostgreSQL+database

10
aki
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

別の選択肢

2
Lauri Lüüs
 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
0
Spike