danh sách postgresql và đặt hàng các bảng theo kích thước


108

Làm cách nào để liệt kê tất cả các bảng của cơ sở dữ liệu PostgreSQL và sắp xếp chúng theo kích thước ?


1
Nếu bạn đang sử dụng máy khách psql dòng lệnh thì một trình đơn giản \d+sẽ hiển thị cho bạn thông tin này, mặc dù không được sắp xếp.
cdhowie

1
Cảm ơn. Nhưng tôi cần sắp xếp , tôi có quá nhiều bảng.
không-có-gì-đặc-biệt-ở đây,

1
Mọi người đang tìm kiếm thứ tương tự nhưng đối với cơ sở dữ liệu thay vì bảng: đây là giải pháp .
Skippy le Grand Gourou

1
Re psql: bắt đầu nó bằng --echo-hidden và nó sẽ cho bạn biết các truy vấn được thực hiện cho \ d + và các lệnh dấu gạch chéo ngược khác. Dễ dàng thêm phân loại.
Jürgen Strobel

Câu trả lời:


149
select table_name, pg_relation_size(quote_ident(table_name))
from information_schema.tables
where table_schema = 'public'
order by 2

Điều này cho bạn thấy kích thước của tất cả các bảng trong lược đồ publicnếu bạn có nhiều lược đồ, bạn có thể muốn sử dụng:

select table_schema, table_name, pg_relation_size('"'||table_schema||'"."'||table_name||'"')
from information_schema.tables
order by 3

Ví dụ về SQLFiddle: http://sqlfiddle.com/#!15/13157/3

Danh sách tất cả các chức năng kích thước đối tượng trong sách hướng dẫn .


Đó là table_schema, không phải schema_name. Truy vấn đầu tiên tốt nhưng bạn đã bắt đầu nhập nội dung nào đó trong phiên psql của mình, điều này gây ra lỗi cú pháp.
yieldsfalsehood

OK mã này hoạt động: select table_schema, table_name, pg_relation_size(table_schema||'.'||table_name) from information_schema.tables order by 3; cảm ơn đã giúp đỡ!
không-có-gì-đặc-biệt-ở đây,

bất kỳ ý tưởng nào điều này không hoạt động trong trường hợp của tôi? stackoverflow.com/questions/40977776/…
Juan Carlos Oropeza

@Sucrenoir: "không hoạt động" không phải là thông báo lỗi Postgres hợp lệ. Truy vấn trong câu trả lời của tôi có hiệu quả với tôi: rextester.com/KGKPR49004
a_horse_with_no_name 20/02/17

Tôi không nhận được hàng nào khi tôi chạy truy vấn đầu tiên. select * from information_schema.tables where table_schema = 'public';tạo ra không hàng mặc dù \dnhiển thị lược đồ công khai. Có thể một thay đổi trong 9.5 gây ra điều này?
chó chăn cừu

71

Điều này sẽ hiển thị cho bạn tên lược đồ, tên bảng, kích thước khá và kích thước (cần thiết để sắp xếp).

SELECT
  schema_name,
  relname,
  pg_size_pretty(table_size) AS size,
  table_size

FROM (
       SELECT
         pg_catalog.pg_namespace.nspname           AS schema_name,
         relname,
         pg_relation_size(pg_catalog.pg_class.oid) AS table_size

       FROM pg_catalog.pg_class
         JOIN pg_catalog.pg_namespace ON relnamespace = pg_catalog.pg_namespace.oid
     ) t
WHERE schema_name NOT LIKE 'pg_%'
ORDER BY table_size DESC;

Tôi xây dựng điều này dựa trên các giải pháp từ đây danh sách lược đồ với kích thước (tương đối và tuyệt đối) trong cơ sở dữ liệu PostgreSQL


21

Điều này sẽ rõ ràng hơn.

pg_size_pretty(<numeric_value>) - chuyển đổi số byte sang định dạng con người có thể đọc được.

pg_database_size(<db_name>)- Nhận kích thước cơ sở dữ liệu theo byte .

pg_total_relation_size(<relation_name>)- nhận tổng kích thước của bảng và chỉ mục của nó theo byte .

pg_relation_size(<relation_name>)- Lấy kích thước quan hệ (bảng / chỉ mục) tính bằng byte .

pg_index_size(<relation_name>)- Nhận kích thước chỉ mục của quan hệ tính bằng byte .

current_database() - lấy cơ sở dữ liệu hiện được sử dụng mà truy vấn này đang được thực hiện.

Truy vấn:

select current_database() as database,
       pg_size_pretty(total_database_size) as total_database_size,
       schema_name,
       table_name,
       pg_size_pretty(total_table_size) as total_table_size,
       pg_size_pretty(table_size) as table_size,
       pg_size_pretty(index_size) as index_size
       from ( select table_name,
                table_schema as schema_name,
                pg_database_size(current_database()) as total_database_size,
                pg_total_relation_size(table_name) as total_table_size,
                pg_relation_size(table_name) as table_size,
                pg_indexes_size(table_name) as index_size
                from information_schema.tables
                where table_schema=current_schema() and table_name like 'table_%'
                order by total_table_size
            ) as sizes;

Kết quả:

 database  | total_database_size | schema_name | table_name | total_table_size | table_size | index_size
-----------+---------------------+-------------+------------+------------------+------------+------------
 vigneshdb | 1586 MB             | corpdata    | table_aaa  | 16 kB            | 0 bytes    | 8192 bytes
 vigneshdb | 1586 MB             | corpdata    | table_bbb  | 24 kB            | 0 bytes    | 16 kB
 vigneshdb | 1586 MB             | corpdata    | table_ccc  | 640 kB           | 112 kB     | 488 kB
 vigneshdb | 1586 MB             | corpdata    | table_ddd  | 9760 kB          | 3152 kB    | 6568 kB
 vigneshdb | 1586 MB             | corpdata    | table_eee  | 1120 MB          | 311 MB     | 808 MB

Định dạng nhân bản được thể hiện trong bytes, kB, MB, GB, và TB.

bytesđến kB- bắt đầu từ10240 bytes

bytesđến MB- bắt đầu từ 10485248 bytes= 10239.5 kB~10 MB

bytesđến GB- bắt đầu từ 10736893952 bytes= 10239.5 MB~10 BG

bytesđến TB- bắt đầu từ 10994579406848 bytes= 10239.5 GB~10 TB

Tất cả các chuyển đổi đơn vị bắt đầu từ 10 + <unit>.

Để tham khảo - Tài liệu chính thức của Postgres


Ví dụ này không hoạt động với tên bảng viết hoa
Ivan Sveshnikov


4
select table_name,n_live_tup, pg_size_pretty(pg_relation_size(table_name))
from information_schema.tables
inner join pg_stat_user_tables  on table_name=relname
where table_schema = 'public'
order by 2 desc

Một thay thế khác


2

Tôi cần tìm bảng nào sử dụng nhiều không gian nhất.

Dựa trên các câu trả lời khác, tôi đã sử dụng truy vấn đó:

select table_name, pg_size_pretty( pg_relation_size(quote_ident(table_name)) )
from information_schema.tables
where table_schema = 'public'
order by pg_relation_size(quote_ident(table_name)) desc

Tôi nhận được kết quả sau:

table_name              pg_size_pretty
--------------------------------------
trade_binance           96 GB
closs_v2_binance_stash  46 GB
closs_bitfinex_stash    5725 MB
trade_bitfinex          5112 MB
...
api_requests            0 bytes
trade_huobi             0 bytes

Tôi nên mua một ổ SSD lớn hơn.


1
 select uv.a tablename, pg_size_pretty(uv.b) sizepretty 
 from (select tb.tablename a, pg_table_size('schemaname.'||tb.tablename::text) b 
        from pg_tables tb 
        where tb.schemaname ilike 'schemaname' 
        order by 2 desc
       ) uv

1
Câu trả lời của bạn sẽ có giá trị hơn nếu bạn kèm theo lời giải thích tại sao cách tiếp cận được đề xuất lại hữu ích.
Cindy Meister

Nó tương tự như câu trả lời của con ngựa, chỉ cần thực hiện phân loại theo kích thước với chế độ xem sắp xếp khá dễ nhìn.
Spike

Vui lòng thêm văn bản đó vào Câu trả lời của bạn, sử dụng liên kết Chỉnh sửa trong không gian "Câu trả lời". Sau đó, đóng góp của bạn sẽ tuân theo các nguyên tắc của StackOverflow (đọc một chút trong Trung tâm trợ giúp) :-)
Cindy Meister
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.