繁体   English   中英

如何找到数据库大小的细分以识别高空间消费者 - postgresql

[英]How to find a breakdown of db size to identify the high space consumer - postgresql

我正在尝试查找我的数据库的大小

我尝试了以下代码

选项1

select t1.datname AS db_name,  
       pg_size_pretty(pg_database_size(t1.datname)) as db_size
from pg_database t1
order by pg_database_size(t1.datname) desc;

选项 2

\l+

对于db1 ,这两个选项都返回 ~2500 GB 的 output 。 但事实是我们的数据(对于 db1)只有 50 GB 左右。

这个 2500 GB 的大小似乎是不可能的(根据我的知识)。

你们能帮我理解表定义、索引设置等是否会占用这么多空间吗?

有没有办法找出是哪一个导致/消耗了如此巨大的空间? 我想知道db1的故障。 所以,我可以找出 db1 的哪个部分占用了这么多空间。 理想情况下,db1 的数据只有 40-50 GB。

选项 1 output

"db1"   "2533 GB"
"dreAm" "23 GB"
"db2"   "23 GB"
"db3"   "20 MB"
"postgres"  "7481 kB"
"template1" "7481 kB"
"template0" "7473 kB"

选项 2 output

  Name    |    Owner    | Encoding |  Collate   |   Ctype    |      Access privileges      |  Size   | Tablespace |                Description
-----------+-------------+----------+------------+------------+-----------------------------+---------+------------+--------------------------------------------
 db2       | test2       | UTF8     | en_US.utf8 | en_US.utf8 | =Tc/dc                     +| 23 GB   | pg_default |
           |             |          |            |            | dc=CTc/dc                  +|         |            |
           |             |          |            |            | webapi_sa=c/dc              |         |            |
 db3       | dream       | UTF8     | en_US.utf8 | en_US.utf8 |                             | 23 GB   | pg_default |
 db1       | test1       | UTF8     | en_US.utf8 | en_US.utf8 | =Tc/kt                     +| 2533 GB | pg_default |
           |             |          |            |            | ktph=CTc/kt                +|         |            |
           |             |          |            |            | webapi_sa=c/ktph           +|         |            |
           |             |          |            |            | za=c/kt                     |         |            |
 test      | test_admin  | UTF8     | en_US.utf8 | en_US.utf8 | =Tc/test_admin             +| 20 MB   | pg_default | test database
           |             |          |            |            | test_admin=CTc/test_admin+  |         |            |
           |             |          |            |            | test_app=Tc/test_admin      |         |            |
 postgres  | postgres    | UTF8     | en_US.utf8 | en_US.utf8 |                             | 7481 kB | pg_default | default administrative connection database
 template0 | postgres    | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres                +| 7473 kB | pg_default | unmodifiable empty database
           |             |          |            |            | postgres=CTc/postgres       |         |            |
 template1 | postgres    | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres                +| 7481 kB | pg_default | default template for new databases

虽然我找到了占用最大 memory 的架构,但我无法使用以下代码列出该架构下的表大小

select table_name, pg_size_pretty(pg_total_relation_size(quote_ident(table_name)))
from information_schema.tables
where table_schema = 'results'
order by pg_total_relation_size(quote_ident(table_name));

当我执行上述操作时,我收到一条错误消息ERROR: relation "metadata" does not exist SQL state: 42P01

但是我们的数据库中确实有metadata表。 然而,它是空的。 我可以知道为什么会这样吗? 有没有其他方法可以找到每个模式下的表大小?

您的一张或多张桌子臃肿。

连接到数据库并找到您最大的对象:

SELECT oid::regclass,
       pg_table_size(oid) AS size
FROM pg_class
ORDER BY size DESC;

这包括 TOAST 表大小。

找到候选人后,使用pgstattuple确认膨胀:

CREATE EXTENSION pgstattuple;
\x
SELECT * FROM pgstattuple_approx('bloated_table');

修复VACUUM (FULL)的问题并调查并修复原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM