【问题标题】:How to find data length and index length of particular tables in a postgresql schema?如何在 postgresql 模式中查找特定表的数据长度和索引长度?
【发布时间】:2019-10-15 19:06:47
【问题描述】:

我正在将我的应用程序从 MySQL 迁移到 PostgreSQL。在 MySQL 中,我使用以下查询根据我的要求使用查询来计算特定表的内存大小,

SELECT SUM(ROUND(((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024),2)) 'Size in MB' FROM  INFORMATION_SCHEMA.TABLES where TABLE_NAME like 'table_name';

但我不能在 PostgreSQL 中做同样的事情。如果我运行相同的查询,它会显示为,

ERROR:  type "sum" does not exist

我已经在各个站点尝试了解决方案,但找不到满足我要求的确切解决方案。请建议我一个解决方案。提前致谢。

【问题讨论】:

    标签: postgresql postgresql-9.6


    【解决方案1】:

    您的查询查询失败,因为您使用单引号作为别名 - 'Size in MB'

    此外,INFORMATION_SCHEMA.TABLES 中没有可用的 DATA_LENGTHINDEX_LENGTH

    在 Postgres 中,您可以使用 pg_total_relation_size 函数。

    SELECT ROUND(pg_total_relation_size (oid) / ( 1024.0 * 1024.0 ), 2) AS 
           "Size in MB" 
    FROM   pg_class c 
    WHERE  relname = 'table_name'; 
    

    查看this 的回答,了解可用于获取各种尺寸的功能。

    DEMO

    【讨论】:

    • 我已经尝试过这个查询,但是当我将它与 mysql 和 postgresql 进行比较时,值会有所不同。
    • @Kishore :我不确定它在 MySQL 中是如何工作的,所以无法对此发表评论。但是,我可以向您保证,返回的值对于 Postgres 表是正确的。检查我在答案中链接的 SO 答案,您可能会发现那里列出了各种尺寸。在查询中替换它并检查其中是否有任何与您期望看到的值密切匹配。另请阅读this answer,其中描述了存储大小在 MySQL 和 Postgres 之间的差异
    • 您的查询中表示的“oid”参数是什么? @Kaushik Nayak
    • @Kishore :阅读OIDspg_class catalog 中的列描述
    • 让我告诉你一个例子,你可以帮助我解决在 postgres 和 mysql 中更改的值。考虑一下,在 postgres 和 mysql 中有一个具有相同结构和相同行数的表。如果我尝试在各自的环境中计算它们的大小,是否存在价值差异的可能性?希望你能理解我的例子和情况。 @Kaushik Nayak
    【解决方案2】:

    PostgreSQL 在 INFORMATION_SCHEMA.TABLES 中没有此信息,但您可以尝试使用表 SVV_TABLE_INFO 来获取表大小。

    希望对你有帮助!

    【讨论】:

    • 不!它只是显示没有像 svv_table_info 这样的关系。请有其他建议。
    猜你喜欢
    • 2021-09-07
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2015-01-02
    • 2011-07-22
    • 2022-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多