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

1
제안 : 변화 '"' || table_schema || '"."' || table_name || '"'format('%I.%I', table_schema, table_name).
jpmc26

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

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;

10

PostgreSQL 테이블에는 테이블 자체, 인덱스 및 TOAST 데이터의 세 가지 구성 요소가 있습니다. http://wiki.postgresql.org/wiki/Disk_Usage 에서 사용 가능한 정보를 다양한 방법으로 슬라이드하고 주사위를 굴리는 방법을 보여주는 몇 가지 예가 있습니다 .


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) INDEX로
    , pg_size_pretty (toast_bytes) AS 토스트
    , pg_size_pretty (table_bytes) AS 테이블
  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. 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
          pg_class c에서
          왼쪽 가입 pg_namespace n ON n.oid = c.relnamespace
          relkind = 'r'위치
  ) ㅏ
) ㅏ

-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.