1

背景:

我正在开发一个允许用户生成许多不同报告的应用程序。数据存储在 PostgreSQL 中,具有自然唯一的 group key,因此一个 group key 的数据完全独立于其他 group key 的数据。一次仅使用 1 个组键构建报告,因此所有查询都使用“WHERE groupKey = X;” 条款。PostgreSQL 中的数据通过并行进程密集更新,将数据添加到不同的组中,但我不需要实时报告。每 30 分钟更新一次即可。

问题:

已经有大约 4 gigs 的数据,我发现一些报告需要很长时间才能生成(最多 15 秒),因为他们需要查询的不是单个表,而是其中的 3-4 个。

我想做的是在不显着改变解决方案的技术或方案的情况下减少创建报告所需的时间。

可能的解决方案

我当时在想的是:

  1. 将一个数据库拆分为多个数据库,每个组键 1 个数据库。然后我将摆脱 WHERE groupKey = X (尽管我在每个表中的该列上都有索引)并且每次要处理的行数会大大减少。

  2. 为只读创建从数据库。然后我必须将数据与 PostgreSQL 的复制机制同步一次,例如每 15 分钟一次(我真的可以这样做吗?或者我必须编写自定义代码)

我不想将数据库更改为 NoSQL,因为我将不得不重写所有 sql 查询而且我不想这样做。如果它是免费的并且在 Windows 上运行,我可能会切换到另一个支持列存储的 SQL 数据库(对不起,没有 Linux 服务器,但如果我必须有的话可能会有)。

你的想法

您会推荐什么作为最初的简单步骤?

4

2 回答 2

1

立即想到报告的两个想法:

1)。设置一些汇总(又名“聚合”)表,这些表是用户可能运行的查询的预计算结果。例如。包含按不同维度分组的计数和总和的表。这可以是一个自动化过程——通过您选择的作业调度程序运行一个数据库函数(或脚本)——每 N 分钟刷新一次数据。

2)。关于复制,如果您使用流式复制(PostgreSQL 9+),主数据库中的更改将复制到从数据库(热备用 = 只读)以进行报告。

于 2013-07-16T21:22:14.880 回答
0
  1. 调整报告查询。使用解释。当您可以在纯 sql 中执行时,请避免使用过程。
  2. 调整服务器;内存、磁盘、处理器。看一下服务器配置。
  3. 升级 postgres 版本。
  4. 做真空。

在 4 个中,只有 1 个需要对应用程序进行重大更改。

于 2013-07-17T08:04:04.843 回答