使用 PostgreSQL 和 Data Studio 的海量数据报告

问题描述

我管理了一个托管在 AWS RDS 中的医疗保健数据库。系统信息如下:

  • Postgresql 9.6
  • 8 个 v 内核和 16GB 内存
  • DB 大小现在是 35GB

问题是我想将帐户表中的几千个用户与其他健康指标表(最多 10 个,每个表几百万条记录)连接起来,以制作自定义数据报告(使用 Google 数据洞察)。 这是我所做的:

  • 将所有需要的表作为一个物化视图加入。
  • 通过此物化视图为 Google 数据洞察提供数据。

但是,我已经等了 10 个小时,它仍然无休止地运行。我以为它永远不会完成。有大数据报告的经验吗?给我关键词。

这是我的物化视图定义:

CREATE MATERIALIZED VIEW report_20210122 AS
SELECT /* long,but simple list */
FROM accounts
INNER JOIN user_weartime ON accounts.id = user_weartime.user_id
INNER JOIN admin_exchanges ON accounts.id = admin_exchanges.user_id
INNER JOIN user_health_source_stress_history ON accounts.id = user_health_source_stress_history.user_id
INNER JOIN user_health_source_step_history ON accounts.id = user_health_source_step_history.user_id
INNER JOIN user_health_source_nutri_history ON accounts.id = user_health_source_nutri_history.user_id
INNER JOIN user_health_source_heart_history ON accounts.id = user_health_source_heart_history.user_id
INNER JOIN user_health_source_energy_history ON accounts.id = user_health_source_energy_history.user_id
INNER JOIN user_health_source_bmi_history ON accounts.id = user_health_source_bmi_history.user_id
where accounts.id in (/* 438 numbers */);

解决方法

为巨大的联接创建物化视图可能对您没有帮助。

您没有向我们展示报告的查询,但我希望它包含一些聚合函数,并且您不想报告包含数百万个原始数据的列表。

首先,确保您拥有所有适当的索引。您需要哪些索引取决于查询。对于您显示的那个,您需要在 accounts(id) 上建立索引,并且(如果您想要嵌套循环连接)在 admin_exchanges(user_id) 上建立索引,对于其他表也是如此。

但要为最终查询找出正确的索引,您必须查看其执行计划。

有时物化视图可以提供很大帮助,但通常是通过预先聚合一些数据。

如果您加入的表超过 8 个,增加 join_collapse_limit 可以为您提供更好的计划。

,

我会问你为什么使用与 PostgreSQL 的直接连接在 DataStudio 中显示数据。尽管支持此功能,但仅当您不想花时间开发良好的数据流(即您的数据很小)或想要显示实时数据时,这才有意义。

但是由于您的数据很大并且您使用的是物化视图,我想这些都不是这种情况。

我建议您改用 BigQuery。 DataStudio 和 BigQuery 配合得非常好,可以非常快速地处理大量数据。我敢打赌,您的查询将在 BigQuery 中运行几秒钟,而且会花费几美分。

遗憾的是,BigQuery 仅支持 Cloud SQL 外部连接器,无法直接连接到您的 AWS RDS 服务。您需要在某处编写 ETL 作业,或者将您的数据库移至 Cloud SQL for PostgreSQL(如果可能,我建议这样做)。

如果您对将数据从 AWS RDS 传输到 BigQuery 感兴趣,请查看这些答案:

,

我改变了我的想法并且知道如何在 start_date 和 user_id 上使用 FULL JOIN,那么每个健康指标都应该是一个大视图中的列。我的报告现在有超过 500k 行和 40 列,但视图创建仍然非常快,而且视图上的查询时间