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 ?
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 ?
Câu trả lời:
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 đồ public
nế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 .
select table_schema, table_name, pg_relation_size(table_schema||'.'||table_name) from information_schema.tables order by 3;
cảm ơn đã giúp đỡ!
select * from information_schema.tables where table_schema = 'public';
tạo ra không hàng mặc dù \dn
hiển thị lược đồ công khai. Có thể một thay đổi trong 9.5 gây ra điều này?
Đ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
Đ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
SELECT
relname as "Table",
pg_size_pretty(pg_total_relation_size(relid)) As "Size",
pg_size_pretty(pg_total_relation_size(relid) - pg_relation_size(relid)) as "External Size"
FROM pg_catalog.pg_statio_user_tables ORDER BY pg_total_relation_size(relid) DESC;
được lấy từ đây https://wiki-bsse.ethz.ch/display/ITDOC/Check+size+of+tables+and+objects+in+PostgreSQL+database
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
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.
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
\d+
sẽ hiển thị cho bạn thông tin này, mặc dù không được sắp xếp.