【问题标题】:PostgreSQL - storing data that never changesPostgreSQL - 存储永不改变的数据
【发布时间】:2021-09-25 19:57:03
【问题描述】:

PostgreSQL 中有没有办法将表标记为存储插入后永远不会更改的数据,从而提高性能? Index-Only Scans and Covering Indexes

但是,对于很少更改的数据,有一种方法可以解决此问题。 PostgreSQL 跟踪表堆中的每一页,是否所有行 存储在该页面中的旧版本足以对所有当前和 未来的交易。此信息存储在一个位中 表的可见性贴图。仅索引扫描,在找到候选对象后 索引条目,检查相应堆的可见性映射位 页。如果已设置,则该行是可见的,因此数据可以是 没有进一步的工作就返回了。如果未设置,则堆条目必须为 访问以了解它是否可见,因此没有性能优势 是通过标准索引扫描获得的

如果 PostgreSQL 知道表中的数据永远不会更改,那么在仅索引扫描中就不必访问堆条目。

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    如果您有真正永远不会改变的数据,请在表格上运行VACUUM (FREEZE)。如果没有并发的长时间运行的事务,则会将可见性映射中的所有块标记为“全部冻结”和“全部可见”。然后,您将获得仅索引扫描,并且反环绕自动清理不必在表上做任何工作。

    【讨论】:

    • 我每分钟插入 500-1000 条记录。该表有两个索引。插入后,记录永远留在那里,永远不会改变。目前大约有 3 亿条记录。在这种情况下会定期运行 VACUUM (FREEZE) 吗?
    • 是的,这应该会有所帮助。请注意,从 v13 开始,PostgreSQL 将自动执行此操作。
    【解决方案2】:

    这在文档中有点难以理解,但基本上你需要在创建表后vacuum。那么如果没有变化(也没有锁),不用担心。

    documentation 确实解释了吸尘更新可见性地图:

    PostgreSQL 的 VACUUM 命令必须定期处理每个表,原因如下:

    。 . .

    1. 更新可见性地图,从而加快仅索引扫描。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-22
      • 1970-01-01
      • 1970-01-01
      • 2021-08-27
      • 2016-10-15
      相关资源
      最近更新 更多