背景
我正在开发一个允许用户生成大量不同报告的应用程序。数据存储在PostgreSQL中并具有自然唯一的组密钥,因此具有一个组密钥的数据完全独立于其他组密钥的数据。报告一次只使用1个组密钥构建,因此所有查询都使用“WHERE groupKey = X;”条款。 PostgreSQL中的数据通过并行进程进行了大量更新,这些进程将数据添加到不同的组中,但我不需要实时报告。每30分钟一次更新很好。
问题:
已经有大约4演出的数据,我发现有些报告需要很长时间才能生成(最多15秒),因为他们需要查询的不是单个表而是3-4个。
我想要做的是减少创建报告所需的时间,而不会显着改变解决方案的技术或方案。
可能的解决方案
我在考虑的是:
将一个数据库拆分为多个数据库,每个组密钥包含1个数据库。然后我将摆脱WHERE groupKey = X(虽然我在每个表中都有该列的索引),每次处理的行数将会少得多。
仅为读取创建从属数据库。然后我将必须每隔15分钟将数据与PostgreSQL的复制机制同步一次(我可以实际执行此操作吗?或者我必须编写自定义代码)
我不想将数据库更改为NoSQL,因为我将不得不重写所有sql查询而我不想这样做。我可以切换到另一个具有列存储支持的SQL数据库,如果它是免费的并且在Windows上运行(对不起,没有Linux服务器,但如果必须的话可能有一个)。
您的想法
作为第一个简单步骤,您会建议什么?
答案 0 :(得分:1)
立即想到报告的两个想法:
1)。设置一些摘要(也称为“聚合”)表,这些表是用户可能运行的查询的预先计算结果。例如。包含按各种维度分组的计数和总和的表。这可以是一个自动化过程 - 数据库函数(或脚本)通过您选择的作业调度程序运行 - 每N分钟刷新一次数据。
2)。关于复制,如果使用流式复制(PostgreSQL 9+),则主数据库中的更改将复制到从属数据库(热备用=只读)以进行报告。
答案 1 :(得分:0)
在4个中,只有1个需要对应用程序进行重大更改。