Postgres / PostgreSQLテーブルとそのインデックスのディスクサイズをどのようにして見つけますか


156

私はOracleからPostgresに来て、テーブルとインデックスのサイズをでbytes/MB/GB/etc、またはすべてのテーブルのサイズをさらに見つける方法を探しています。Oracleでは、user_lobsとuser_segmentsを調べて答えを返す厄介な長いクエリがありました。

Postgresではinformation_schemaテーブルで使用できるものがあると思いますが、どこにあるのかわかりません。


回答:


271

データベースオブジェクトサイズ関数を試してください。例:

SELECT pg_size_pretty(pg_total_relation_size('"<schema>"."<table>"'));

すべてのテーブルについて、次の行に沿ったもの:

SELECT
    table_schema || '.' || table_name AS table_full_name,
    pg_size_pretty(pg_total_relation_size('"' || table_schema || '"."' || table_name || '"')) AS size
FROM information_schema.tables
ORDER BY
    pg_total_relation_size('"' || table_schema || '"."' || table_name || '"') DESC;

編集:便宜上、@ phordから送信されたクエリを次に示します。

SELECT
    table_name,
    pg_size_pretty(table_size) AS table_size,
    pg_size_pretty(indexes_size) AS indexes_size,
    pg_size_pretty(total_size) AS total_size
FROM (
    SELECT
        table_name,
        pg_table_size(table_name) AS table_size,
        pg_indexes_size(table_name) AS indexes_size,
        pg_total_relation_size(table_name) AS total_size
    FROM (
        SELECT ('"' || table_schema || '"."' || table_name || '"') AS table_name
        FROM information_schema.tables
    ) AS all_tables
    ORDER BY total_size DESC
) AS pretty_sizes;

pg_table_size()メタデータを含めてサイズを合計するために使用するように少し変更しました。


3
ちなみに、誰かが大きく繰り返される表現をエイリアスする方法について何か情報があれば、私はそれを聞いてうれしいです。
aib

2
エイリアスはできませんが、サブクエリでいつでも実行できます。例:SELECT table_full_name、pg_size_pretty(size)FROM(SELECT .. AS table_full_name、.. AS size FROM ....)x ORDER BY size
Magnus Hagander 2010

1
提案:に変更'"' || table_schema || '"."' || table_name || '"'format('%I.%I', table_schema, table_name)ます。
jpmc26 2017年

174

データベースのサイズを表示:

\l+

例えば

=> \l+
 berbatik_prd_commerce    | berbatik_prd     | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                       | 19 MB   | pg_default | 
 berbatik_stg_commerce    | berbatik_stg     | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                       | 8633 kB | pg_default | 
 bursasajadah_prd         | bursasajadah_prd | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                       | 1122 MB | pg_default | 

テーブルのサイズを表示:

\d+

例えば

=> \d+
 public | tuneeca_prd | table | tomcat | 8192 bytes | 
 public | tuneeca_stg | table | tomcat | 1464 kB    | 

でのみ機能しpsqlます。

@zkutchの回答の要約)


28
テーブルとインデックスの両方を表示する必要がある場合\dti+は、トリックを実行します。
tomasz

これは名前でソートされて返されますが、トップの回答はサイズの降順でソートされます
Izkata

23

データベース名がのsnort場合、次の文でそのサイズがわかります。

psql -c "\l+ snort" | awk -F "|" '{print $7}'

2
サイズをすばやく表示するための最も簡単な答えです。これをシェル関数に入れましたdbsize
RichVel 2013

12

Tyr this:(インデックスサイズ/使用統計)

SELECT
    t.tablename,
    indexname,
    c.reltuples AS num_rows,
    pg_size_pretty(pg_relation_size(quote_ident(t.tablename)::text)) AS table_size,
    pg_size_pretty(pg_relation_size(quote_ident(indexrelname)::text)) AS index_size,
    CASE WHEN indisunique THEN 'Y'
       ELSE 'N'
    END AS UNIQUE,
    idx_scan AS number_of_scans,
    idx_tup_read AS tuples_read,
    idx_tup_fetch AS tuples_fetched
FROM pg_tables t
LEFT OUTER JOIN pg_class c ON t.tablename=c.relname
LEFT OUTER JOIN
    ( SELECT c.relname AS ctablename, ipg.relname AS indexname, x.indnatts AS number_of_columns, idx_scan, idx_tup_read, idx_tup_fetch, indexrelname, indisunique FROM pg_index x
           JOIN pg_class c ON c.oid = x.indrelid
           JOIN pg_class ipg ON ipg.oid = x.indexrelid
           JOIN pg_stat_all_indexes psai ON x.indexrelid = psai.indexrelid )
    AS foo
    ON t.tablename = foo.ctablename
WHERE t.schemaname='public'
ORDER BY 1,2;


5

参考までに、@ aibから優れた回答を得て、少し修正しました。

  • 「パブリック」スキーマからテーブルのみを取得する
  • マテリアライズドビューのデータとインデックスサイズも表示します

マテリアライズドビューでは、マテリアライズドビューを同時に更新するためにインデックスを使用できるため、更新中にそれらを使用できます。

さて、私のクエリは次のようになります:

SELECT
    table_name,
    pg_size_pretty(table_size) AS table_size,
    pg_size_pretty(indexes_size) AS indexes_size,
    pg_size_pretty(total_size) AS total_size
FROM (
    SELECT
        table_name,
        pg_table_size(table_name) AS table_size,
        pg_indexes_size(table_name) AS indexes_size,
        pg_total_relation_size(table_name) AS total_size
    FROM (
        -- tables from 'public'
        SELECT table_name
        FROM information_schema.tables
        where table_schema = 'public' and table_type = 'BASE TABLE'
        union
        -- materialized views
        SELECT oid::regclass::text as table_name
        FROM pg_class
        WHERE relkind = 'm'
        order by table_name
    ) AS all_tables
    -- ORDER BY total_size DESC
    order by table_name
) AS pretty_sizes

1

以下のクエリはあなたに役立ちます

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;

このリンクを参照してください:https : //wiki.postgresql.org/wiki/Disk_Usage


0

このウィキをチェックしてください。https://wiki.postgresql.org/wiki/Disk_Usage

SELECT *、pg_size_pretty(total_bytes)AS合計
    、pg_size_pretty(index_bytes)AS INDEX
    、pg_size_pretty(toast_bytes)ASトースト
    、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

-1

次のスクリプトを試して、すべてのテーブルサイズを見つけます。

SELECT
    table_schema || '.' || table_name AS TableName,
    pg_size_pretty(pg_total_relation_size('"' || table_schema || '"."' || table_name || '"')) AS TableSize
FROM information_schema.tables
ORDER BY
    pg_total_relation_size('"' || table_schema || '"."' || table_name || '"') DESC

PostgreSQLでサイズを検索する他の異なるスクリプトについては、次のURLにアクセスしてください。http//www.dbrnd.com/2015/05/how-to-find-size-of-database-and-table-in-postgresql/

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.