Postgres分区?

use*_*996 3 postgresql database-partitioning

我的软件每30分钟运行一次cronjob,从Google Analytics/Social网络中提取数据并将结果插入到Postgres数据库中.

数据如下所示:

url text NOT NULL,    
rangeStart timestamp NOT NULL,
rangeEnd timestamp NOT NULL,
createdAt timestamp DEFAULT now() NOT NULL,
...
(various integer columns)
Run Code Online (Sandbox Code Playgroud)

由于一个查询返回10 000多个项目,因此将这些数据存储在单个表中显然不是一个好主意.按此速度,cronjob每天将产生约48万条记录,每月产生约1450万条记录.

我认为解决方案是使用几个表,例如我可以使用特定的表来存储给定月份生成的数据:stats_2015_09,stats_2015_10,stats_2015_11等.

我知道Postgres支持表分区.但是,我对这个概念不熟悉,所以我不确定最好的方法是什么.在这种情况下我是否需要分区,还是应该手动创建这些表?或者也许有更好的解决方案?

稍后将以各种方式查询数据,并且这些查询预计会快速运行.

编辑:

如果我最终得到12-14个表,每个表存储10-20百万行,Postgres应该仍能快速运行select语句,对吧?插入不必非常快.

Gor*_*off 7

这个评论太长了.

在各种情况下,分区是个好主意.想到的两个是:

  • 您的查询有一个WHERE子句,可以很容易地映射到一个或少数几个分区.
  • 您希望以快速方式删除历史数据(删除分区比删除记录更快).

如果不了解您想要运行的查询类型,很难说分区是否是个好主意.

我想我可以说将数据拆分成不同的表是一个主意,因为这是一个维护噩梦:

  • 您不能在表中包含外键引用.
  • 跨越多个表的查询很麻烦,因此很难回答简单的问题.
  • 维护表变成了一场噩梦(添加/删除列).
  • 如果您的用户具有不同的角色,则必须仔细维护权限.

无论如何,开始的地方是Postgres关于分区的文档,就在这里.我应该注意到Postgres的实现比其他数据库更难以实现,因此您可能需要查看MySQL或SQL Server的文档以了解它正在做什么.