【问题标题】:Postgresql Table Partitioning Django ProjectPostgresql 表分区 Django 项目
【发布时间】:2015-08-14 08:46:26
【问题描述】:

我有一个使用 Postgres 9.3 的 Django 1.7 项目。我有一张容量很大的桌子。该表每月将有 1300 万到 4000 万个新行。

我想知道将 Postgres 表分区与 Django 结合的最佳方式是什么?

【问题讨论】:

    标签: django postgresql partitioning


    【解决方案1】:

    如果你使用的是新版本的 PostgreSQL,你可以试试这个

    https://github.com/chaitin/django-pg-timepart

    一个 Django 扩展,它实现了 PostgreSQL 表以根据日期进行分区和管理。

    【讨论】:

      【解决方案2】:

      您可以使用Architect 申请Postgresql Table Partitioning Django Project

      PostgreSQL 在 Architect 中的分区实现是纯粹的 在数据库级别。这意味着 Architect 创建了几个 触发器和函数,并将它们直接插入到数据库中,所以 即使您从数据库控制台发出直接插入语句并且 不是来自 ORM,一切都会按预期工作,记录将是 插入正确的分区,如果分区不存在,则 将自动为您创建。也可以创建分区 以任何顺序,而不仅仅是从低到高。

      这是旧Django DB Parti application的新版本

      【讨论】:

      • 所以这是真的,但它看起来不像将表创建为分区的,所以添加索引似乎不会流入子表。
      • 更新,Postgres 在版本 12 中支持分区,所以你应该更新到那个。
      【解决方案3】:

      只要您使用inheritance,然后只将父表连接到您的Django 模型,分区应该对Django 完全透明。也就是说,父表上的SELECT 将向下级联到分区,除非显式使用ONLY 关键字(如果适用)。

      请注意,分区确实增加了复杂性,因为需要实施一种编程方法来确定何时需要创建新分区,然后创建它们——或者在特定时间间隔手动执行此操作。根据您的确切数据和业务逻辑,您很可能还需要实现 triggersrules 来确定将INSERT 放入哪个分区(因为你不想INSERT 进入父表)。然而,这些也应该从 Django 中抽象出来。

      我发现,根据具体情况,这可能需要在您的主要应用程序关闭时完成,以免新分区的创建导致死锁。

      另外值得考虑的是您是否需要随着时间的推移创建真正的分区,或者如果表foofoo_archive 的继承模型就足够了,其中foo_archive 继承自foo,并且定期某些东西(例如脚本)将旧数据移动到 foo_archive 以保持 foo 更小。

      【讨论】:

        猜你喜欢
        • 2014-08-14
        • 2015-01-19
        • 1970-01-01
        • 2013-07-20
        • 2012-02-26
        • 2018-07-29
        • 2023-03-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多