【发布时间】:2018-06-07 13:46:22
【问题描述】:
我们的应用/数据
我们有一个 Python 应用程序,其中 Transactions 中的 Users 具有 Commissions、Fees 等,其中 Contacts 接收 EmailMessages 和 Activity s 发生在(Documents 上传,Status 更改等)。
我们的报告
我们为客户生成电子表格报告,详细说明上传到交易的文件数量、赚取的各种佣金总额、收取的费用、活动等信息。在某些情况下,这些报告提供客户的统计数据帐户,用于给定年份中的每个月(每个月在电子表格中的单独行中)。
我们的问题
尽管我们努力优化查询、添加索引并且尽管我们只使用 SSD 并且有足够的 RAM 以将数据库装入内存。从本质上讲,我们已经达到了一些基本报告变得过于昂贵而无法针对我们的生产数据库作为简单聚合查询运行的规模。
我正在考虑的解决方案
- 将统计信息非规范化到 Postgres 中的现有表中
- Memcached 中的缓存统计信息
- 通过将一些处理转移到 Python 中来减少/简化查询
- 在队列中运行昂贵的报告并在准备好时通知管理员
- 将统计信息存储在单独的报告表中(星型模式等)
- 分片
我已经在一定程度上使用了上面的选项 1-4,但我想探索更多选项。另外,如果可能的话,我想完全停止使用选项 4,而且我不太热衷于实施选项 5(而不是简单地使用 Redshift 之类的东西)。在某些情况下,选项 6 是一个不错的选择,但我们目前还没有准备好采用。
我应该去哪里看?
我实际上开始研究 Redshift,但今天早上让我陷入困境的是阅读 (here) 说“它不是实时分析引擎。”这是否也意味着“ 它对于在单个 Web 请求中生成报告没有用”,或者这个博客更有可能声明它对实时应用程序(在线游戏等)没有用处? p>
我也看过 Quicksight,但它似乎更适合为我们自己构建业务仪表板,而不是为我们的用户生成报告。
根据以上信息,您将如何解决这个问题? Redshift 是显而易见的答案吗?我对不适合实时的上述担忧没有实际意义?在这种情况下,是否有其他一些对您更有意义的服务、工具或方法?
【问题讨论】:
-
你计算过哪些部分慢了吗?您是同时为所有客户创建报告还是只为一位客户创建报告?
-
@Ante 在他们请求此类报告时,一次只针对一位客户。我们有很多报表,每个报表都有几个参数,例如年份、交易状态、位置(对于有很多位置的办公室)等。慢速部分涉及对一些较大表的一些聚合查询(例如,Activity,它有很多百万行,文档,它有数百万行等)。有一些特别慢的查询,但报告也很慢,因为相对较慢的查询(约 200 毫秒)的必要数量加起来。
-
您是否考虑过预先聚合更大的表(也许这就是您对选项 3 的意思)。例如,因为您的报告(至少您提到的报告)似乎是每月的,我希望您查询的表有每月数据而不是每日数据。
-
@mucio 这就是我所说的选项 5,但我们有一些我们每月计算的东西,一些基于自定义日期范围等。
标签: python optimization reporting amazon-redshift star-schema