Làm thế nào để bạn tìm thấy kích thước đĩa của bảng Postgres / PostgreSQL và các chỉ mục của nó


156

Tôi đang đến Postgres từ Oracle và đang tìm cách để tìm kích thước bảng và chỉ mục theo bytes/MB/GB/etc, hoặc thậm chí tốt hơn kích thước cho tất cả các bảng. Trong Oracle tôi đã có một truy vấn dài khó chịu, nhìn vào user_lobs và user_segments để trả lời.

Tôi giả sử trong Postgres có thứ gì đó tôi có thể sử dụng trong các information_schemabảng, nhưng tôi không thấy ở đâu.


Câu trả lời:


271

Hãy thử các hàm kích thước đối tượng cơ sở dữ liệu . Một ví dụ:

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

Đối với tất cả các bảng, một cái gì đó dọc theo dòng:

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;

Chỉnh sửa: Đây là truy vấn được gửi bởi @phord, để thuận tiện:

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;

Tôi đã sửa đổi nó một chút để sử dụng pg_table_size()để bao gồm siêu dữ liệu và tăng kích thước.


3
Ngẫu nhiên, nếu ai đó có bất kỳ thông tin nào về cách đặt bí danh cho biểu thức lớn, lặp đi lặp lại, tôi rất vui khi nghe nó.
aib

2
Bạn không thể đặt bí danh cho nó, nhưng bạn luôn có thể chạy nó trong một truy vấn con ... như: CHỌN bảng_full_name, pg_size_pretty (kích thước) TỪ (CHỌN .. NHƯ bảng_full_name, .. NHƯ kích thước TỪ ....) x ĐẶT HÀNG theo kích thước
Magnus Hagander

1
Một gợi ý: đổi '"' || table_schema || '"."' || table_name || '"'thành format('%I.%I', table_schema, table_name).
jpmc26

174

Hiển thị kích thước cơ sở dữ liệu:

\l+

ví dụ

=> \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 | 

Hiển thị kích thước bảng:

\d+

ví dụ

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

Chỉ hoạt động trong psql.

(Tóm tắt câu trả lời của @ zkutch .)


28
Nếu một người cần xem cả bảng và chỉ mục, \dti+sẽ thực hiện thủ thuật.
tomasz

Trả về này được sắp xếp theo tên mặc dù, câu trả lời hàng đầu trả về được sắp xếp theo kích thước giảm dần
Izkata

23

Nếu tên cơ sở dữ liệu là snort, câu sau đây cho kích thước của nó:

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

2
Cho đến nay câu trả lời đơn giản nhất để xem nhanh kích thước. Tôi đã đặt cái này trong một hàm shell dbsize.
RichVel

12

Tyr này: (Chỉ số kích thước / thống kê sử dụng)

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

Các bảng PostgreSQL có ba thành phần: chính bảng đó, bất kỳ chỉ mục nào trên đó và có khả năng dữ liệu TOAST. Có một vài ví dụ cho thấy cách trượt và xúc xắc các thông tin có sẵn theo nhiều cách khác nhau tại http://wiki.postgresql.org/wiki/Disk_Usage


5

Chỉ để biết thông tin, tôi đã nhận được câu trả lời xuất sắc từ @aib và sửa đổi một chút cho:

  • chỉ nhận các bảng từ lược đồ "công khai"
  • cũng hiển thị dữ liệu lượt xem được cụ thể hóa và kích thước chỉ mục

Trên chế độ xem cụ thể hóa, chúng tôi có thể sử dụng chỉ mục để làm mới đồng thời các chế độ xem được cụ thể hóa , cho phép sử dụng chúng trong khi cập nhật.

Vâng, truy vấn của tôi sẽ như sau:

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

Truy vấn dưới đây sẽ phục vụ bạn

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;

Xem liên kết này: https://wiki.postgresql.org/wiki/Disk_Usage


0

kiểm tra wiki này https://wiki.postgresql.org/wiki/Disk_Usage

CHỌN *, pg_size_pretty (Total_bytes) NHƯ
    , pg_size_pretty (index_bytes) NHƯ INDEX
    , pg_size_pretty (toast_bytes) NHƯ
    , pg_size_pretty (bảng_byte) NHƯ BẢNG
  TỪ (
  CHỌN *, Total_bytes-index_bytes-COALESCE (toast_bytes, 0) NHƯ bảng_byte TỪ (
      CHỌN c.oid, nspname AS table_schema, relname AS TABLE_NAME
              , c.reltuples NHƯ row_estimate
              , pg_total_relation_size (c.oid) NHƯ tổng_byte
              , pg_indexes_size (c.oid) AS index_bytes
              , pg_total_relation_size (reltoastrelid) NHƯ toast_bytes
          TỪ pg_group c
          HÃY THAM GIA pg_namespace n ON n.oid = c.relnamespace
          WHERE relkind = 'r'
  ) một
) một

-1

Hãy thử tập lệnh này để tìm tất cả kích thước bảng:

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

Đối với các tập lệnh khác nhau để tìm kích thước trong PostgreSQL, vui lòng truy cập url này: http://www.dbrnd.com/2015/05/how-to-find-size-of-database-and-table-in-postgresql/

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.