Disk Usage/ja
原文最終更新日:5 June 2016
データベース内の様々なオブジェクトのサイズを確認方法
一般的なテーブルサイズ情報
以下はrawバイト数と"pretty"形式(訳注:pg_size_prettyを使ったMBやGBといった適切な単位でのサイズでの自動表示のこと)の両方で、すべてのテーブルのサイズ情報を報告します。
SELECT *, pg_size_pretty(total_bytes) AS total
, pg_size_pretty(index_bytes) AS index
, pg_size_pretty(toast_bytes) AS toast
, pg_size_pretty(table_bytes) AS table
FROM (
SELECT *, total_bytes-index_bytes-coalesce(toast_bytes,0) AS table_bytes FROM (
SELECT c.oid,nspname AS table_schema, relname AS table_name
, c.reltuples AS row_estimate
, pg_total_relation_size(c.oid) AS total_bytes
, pg_indexes_size(c.oid) AS index_bytes
, pg_total_relation_size(reltoastrelid) AS toast_bytes
FROM pg_class c
LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE relkind = 'r'
) a
) a;
クラスタ内での最大データベースの確認方法
ユーザが接続できないデータベースは、無限大のサイズとして格納されています。
SELECT d.datname as Name, pg_catalog.pg_get_userbyid(d.datdba) as Owner,
CASE WHEN pg_catalog.has_database_privilege(d.datname, 'CONNECT')
THEN pg_catalog.pg_size_pretty(pg_catalog.pg_database_size(d.datname))
ELSE 'No Access'
END as Size
FROM pg_catalog.pg_database d
order by
CASE WHEN pg_catalog.has_database_privilege(d.datname, 'CONNECT')
THEN pg_catalog.pg_database_size(d.datname)
ELSE NULL
END desc -- nulls first
LIMIT 20
最大のリレーションサイズの確認方法
リレーションとはテーブルやインデックスのようなデータベース内のオブジェクトのことであり、このクエリではすべての部品それぞれのサイズを表示します。通常の、そしてTOASTの断片を持つテーブルは別々の構成部品に分割されます;主要な合計値にそれらを含めるであろう方法がディスク使用量の決定にて例で示されており、現在のPostgreSQL9.0においてはpg_relation_sizeの代わりにpg_table_sizeの使用によって自動的に含めることが可能です:
このページ上のこの地点以降のクエリすべては、現在接続しているデータベースのオブジェクトのみのサイズを表示することに注意してください。
SELECT nspname || '.' || relname AS "relation",
pg_size_pretty(pg_relation_size(C.oid)) AS "size"
FROM pg_class C
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
WHERE nspname NOT IN ('pg_catalog', 'information_schema')
ORDER BY pg_relation_size(C.oid) DESC
LIMIT 20;
出力例(pgbenchにてscale=25でデータべースを作成)
relation | size
------------------------+------------
public.accounts | 326 MB
public.accounts_pkey | 44 MB
public.history | 592 kB
public.tellers_pkey | 16 kB
public.branches_pkey | 16 kB
public.tellers | 16 kB
public.branches | 8192 bytes
最大テーブルの合計サイズの確認方法
このバージョンのクエリはpg_total_relation_sizeを使用しており、それぞれの断片に分けられたものではなく、インデックスとTOASTデータを含んだテーブルによって使用されているディスク容量の総計値を表示します:
SELECT nspname || '.' || relname AS "relation",
pg_size_pretty(pg_total_relation_size(C.oid)) AS "total_size"
FROM pg_class C
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
WHERE nspname NOT IN ('pg_catalog', 'information_schema')
AND C.relkind <> 'i'
AND nspname !~ '^pg_toast'
ORDER BY pg_total_relation_size(C.oid) DESC
LIMIT 20;
8.1より前バージョンでのサイズ確認方法
pg_relation_size関数はPostgreSQL8.1で導入されました。8.1より前のバージョンでは、以下のクエリを代わりに利用でき、メガバイト単位でのサイズを表示します:
SELECT
relname, (relpages * 8) / 1024 as size_mb
FROM pg_class ORDER by relpages DESC LIMIT 20;
ここではTOASTのためのサイズについては自身で計算する必要があります。relpagesは特定テーブルへの最後のVACUUMもしくはANALYZEによってのみ更新されることを覚えておいてください。
8.4以降でのサイズ確認方法
バージョン8.4では、pg_relation_sizeがregclass型を使用するように変更され、pg_relation_size(data_type_name)が使用できないことを意味しています。
これらのクエリへの容易なアクセス
~/.psqlrc tricks: table sizesでは、psqlにてこのようなサイズに関連したクエリを簡単に実行する方法を示しています。