Disk Usage/ja

原文最終更新日：5 June 2016
__NOTOC__
== データベース内の様々なオブジェクトのサイズを確認方法 ==
* テーブルサイズ、データベースサイズ（訳注：英語サイト）
== 一般的なテーブルサイズ情報 ==
以下は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にてこのようなサイズに関連したクエリを簡単に実行する方法を示しています。
Category:SQL
Category:AdministrationCategory:Performance
Category:Japanese