【问题标题】:How to create tables with millions of rows with fast performance in PostgreSQL?如何在 PostgreSQL 中创建具有数百万行且性能快速的表?
【发布时间】:2017-03-28 17:50:04
【问题描述】:

我的数据对应于一个表中的 4 亿行,并且肯定会不断增加,我想知道我能做些什么才能在 PostgreSQL 中以一种仍然可以制作的方式拥有这样一个表使用它的复杂查询。换句话说,我应该怎么做才能以最高效的方式获取所有数据?

【问题讨论】:

  • 取决于您的复杂查询。例如,您可以使用Inheritance 并按天对数据进行分区。
  • 任何类型的查询,因为使用多个连接和正则表达式的查询到使用简单过滤器和聚合的查询,我的一个朋友建议使用分区,但我不知道它是否适合我的我每天收到 200 万行的情况。因为如果我每月划分它,它仍然会很大(大约 6000 万行),而且我每天都会有大量的表。
  • 再次取决于您的要求。例如,我一天有 400 万,只是进行计算并删除旧数据。然后只查询合并的数据,而不是原始数据。
  • 例如,如果我有一个关于我发送的电子邮件的表格,我想交叉客户信息以了解特定客户是否收到了特定电子邮件。这个查询有 8000 万条记录,速度已经很慢了。
  • 我会投票结束,因为你的问题太模糊了。请阅读How-to-Ask 这里是START 了解如何提高问题质量并获得更好答案的好地方。

标签: postgresql postgresql-9.1 postgresql-9.3 postgresql-9.2 postgresql-9.4


【解决方案1】:

尝试找到一种方法将数据拆分为多个分区(例如按天/月/周/年)。

在 Postgres 中,它是使用inheritance 实现的。

这样,如果您的查询能够只使用某些分区,您将不得不一次处理更少的数据(例如,从磁盘读取更少的数据)。

您必须与查询一起设计表/索引/分区 - 它们的结构将取决于您希望如何使用它们。

此外,您可能需要通宵工作,根据历史数据准备物化视图。这样您就不必删除旧数据,您可以只处理聚合视图和最新数据。

【讨论】:

  • 这似乎是我唯一的选择。我只是担心随着时间的推移它会变慢,因为现在我们每月有超过 6000 万行,而且还在增加。我每个月都必须创建子表,对吗?抱歉,我仍在学习所有这些过程。
  • @MarcusVinícius 是的,如果您按月进行分区,那么您将需要一个单独的进程/脚本来继续创建新分区。如果您可以在一夜之间在物化视图中聚合数据 - 那么当您拥有更多数据时,它不应该变慢。​​
猜你喜欢
  • 2018-12-26
  • 2018-01-01
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
  • 2016-05-02
  • 1970-01-01
  • 2012-05-15
  • 1970-01-01
相关资源
最近更新 更多