【问题标题】:How does Heroku Postgres count rows for purposes of enforcing plan limits?Heroku Postgres 如何计算行数以执行计划限制?
【发布时间】:2020-11-18 17:53:25
【问题描述】:

我收到了来自 Heroku 的以下电子邮件:

Heroku 应用 [已编辑] 上的数据库 DATABASE_URL 有 超出了分配的存储容量。需要立即采取行动。

数据库包含 12,858 行,超过了 Hobby-dev 计划限制 10,000。对数据库的 INSERT 权限将自动 7天后撤销。这将在大多数情况下导致服务失败 依赖于该数据库的应用程序。

为避免服务中断,请将数据库迁移到 Hobby 基本(9 美元/月)或更高的数据库计划:

https://hello.heroku.com/upgrade-postgres-c#upgrading-with-pg-copy

如果你无法升级数据库,你应该减少 存储在其中的记录数。

在我收到这封电子邮件时,我的 postgres 数据库只有一个包含 5693 行的表,这与电子邮件中提到的“12858 行”不匹配。我在这里错过了什么?

也许值得一提的是,我的数据库也有上面提到的表的a view,Heroku 可能会将其添加到计数中(尽管不是实际表),将行计数从 5693 增加到 11386,这仍然与邮件中提到的 12858 不匹配,但更接近。

【问题讨论】:

    标签: postgresql heroku


    【解决方案1】:

    TL;DR 视图中的行确实会影响总行数,即使它不是物化视图,尽管视图不存储数据。


    我跑了heroku pg:info,看到了这条线:

    Rows: 12858/10000 (Above limits, access disruption imminent)

    然后我放弃了我在原帖中提到的视图,并再次运行heroku pg:info

    Rows: 5767/10000 (Above limits, access disruption imminent)

    因此,视图确实会被计入总行数,这似乎很愚蠢,因为视图实际上并不存储任何数据。

    我也不知道为什么(Above limits, access disruption imminent)字符串在将行号减少到10000以下限制后仍然存在,但是在一分钟后再次运行heroku pg:info后,我得到了

    Rows: 5767/10000 (In compliance)

    显然合规标志不会与行号同时更新。

    更奇怪的是,当我后来重新创建我删除的相同视图并再次运行 heroku pg:info 时,行数并没有翻倍回到 ~11000,而是保持在 ~5500。


    请注意,以下 SQL 命令将显示数据库中各种对象的行数:

    select table_schema, 
           table_name, 
           (xpath('/row/cnt/text()', xml_count))[1]::text::int as row_count
    from (
      select table_name, table_schema, 
             query_to_xml(format('select count(*) as cnt from %I.%I', table_schema, table_name), false, true, '') as xml_count
      from information_schema.tables
      where table_schema = 'public' --<< change here for the schema you want
    ) t
    

    上面的查询是从here复制粘贴的

    【讨论】:

      【解决方案2】:

      听起来你会有两个不同的时刻来测量你的 postgresql 数据库的使用情况:第一个具有更高的值(12.858 行超过了免费限制,并在 Heroku 测量),第二个具有更少的值(5693 行,其中会受到免费限制,可以在您当地的环境中测量吗?)。

      无论如何 - 首先要做的事:在 Heroku 上查看您的 PostgreSQL 数据库 - 这可以通过两种方式完成:

      1. 将您的本地 Heroku CLI 与您的 dyno 连接并检查相关 PostgreSQL 数据库的信息 HowTo see the database related info

      2. 登录到您的 Heroku WebGUI 并检查其中的大小和行数 Heroku Postgres

      他们的数据库监控背后的背景是 Heroku 在那里解释: Monitoring Heroku Postgres

      【讨论】:

      • 这两个不同的时刻相隔 9 分钟,我的应用没有理由在如此短的时间内实现如此巨大的行数飞跃。此外,我提到的数字来自我的 Heroku Postgres 数据库,而不是本地环境。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-08
      • 1970-01-01
      • 2010-11-05
      • 2015-11-20
      • 1970-01-01
      相关资源
      最近更新 更多