【问题标题】:PostgreSQL pg_database_size different from sum of pg_total_relation_sizePostgreSQL pg_database_size 不同于 pg_total_relation_size 的总和
【发布时间】:2015-09-13 19:49:00
【问题描述】:

目前,我的开发数据库占用的磁盘空间比它应该的要多。该项目使用 Django、Docker-Machine 和 PostgreSQL。奇怪的是,当我使用pg_database_size()时,它说使用了大约9MB的磁盘空间(上传的文件只有20KB)。但是,当我总结所有表的大小时(即总结对查询 SELECT relname FROM pg_class WHERE relkind='r' AND relname !~ '^(pg_|sql_)'; 返回的每个表名执行 pg_total_relation_size() 的结果),报告的总大小仅为 1.8MB。我正在使用psycopg2 来查询我的数据库。

究竟为什么尺寸会有如此大的差异?我看到了一个类似的问题,答案似乎是清除任何未正确删除的 LOB。我做了以下事情:

docker exec -it <name_of_database_container> vacuumlo -U postgres -W -v postgres

它报告说它成功删除了 0 个 LOB,所以 LOB 似乎从来都不是我的问题。还有什么可能发生的?我是不是使用SELECT relname.... 查询正确获取所有表名?

【问题讨论】:

    标签: django postgresql psycopg2


    【解决方案1】:

    您的 pg_total_relation_size 查询不包括以 pg_ 开头的系统表。这些表确实仍然占用空间。

    我手中的最小可能(未损坏)数据库约为 7.2MB。所以你给出的数字是有效的。

    【讨论】:

      【解决方案2】:

      pg_total_relation_size 的文档说它包含索引的大小,但我的数据库不是这样。这可能是因为我使用显式名称而不是匿名索引创建了索引。

      这里有一些查询可以帮助追踪空间的去向:

      -- total database size on disk
      select * from pg_size_pretty(pg_database_size('etlq'));
      
      -- total sizes by schema
      select nspname, pg_size_pretty(sum(pg_total_relation_size(C.oid)))
      FROM pg_class C
      LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
      GROUP BY nspname;
      
      -- total size by relation
      select nspname, relname, pg_size_pretty(pg_total_relation_size(C.oid)), pg_total_relation_size(c.oid)
      FROM pg_class C
      LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
      WHERE true
      and pg_total_relation_size(C.oid) > 10 * 1024 * 1024 -- greater than 10MB
      ORDER BY pg_total_relation_size(C.oid) DESC, nspname;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-23
        • 1970-01-01
        • 2020-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多