Disk Usage/ja

From PostgreSQL wiki
Jump to navigationJump to search


原文最終更新日:5 June 2016


データベース内の様々なオブジェクトのサイズを確認方法

一般的なテーブルサイズ情報

Performance Snippets

Disk usage

Works with PostgreSQL

>=9.0

Written in

SQL

Depends on

Nothing


以下は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;

クラスタ内での最大データベースの確認方法

Performance Snippets

Disk usage

Works with PostgreSQL

>=8.2

Written in

SQL

Depends on

Nothing


ユーザが接続できないデータベースは、無限大のサイズとして格納されています。

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

最大のリレーションサイズの確認方法

Performance Snippets

Disk usage

Works with PostgreSQL

>=8.1

Written in

SQL

Depends on

Nothing


リレーションとはテーブルやインデックスのようなデータベース内のオブジェクトのことであり、このクエリではすべての部品それぞれのサイズを表示します。通常の、そして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にてこのようなサイズに関連したクエリを簡単に実行する方法を示しています。