如何高效地按小时查询大型数据库?

Posted

技术标签:

【中文标题】如何高效地按小时查询大型数据库?【英文标题】:How to efficiently query a large database on a hourly basis? 【发布时间】:2020-06-18 02:49:23 【问题描述】:

背景:

我在每个城市的 redshift 数据库中存储了多个资产表,总共 8 个城市。这些资产表按小时显示状态更新。 8 个 SQL 表,一年大约 5 亿行数据。 (我还可以访问每分钟更新此数据的服务器。)

示例:一个市场可以有 20k 资产,每天显示 480k(20k*24 小时)状态更新。

这些状态更新是原始格式,需要经过转换过程,该过程当前编写在 SQL 视图中。最终状态将进入我们的 BI 工具 (Tableau) 以供外部利益相关者查看。

问题:

当前处理数据的方式既慢又低效,在 Tableau 中每小时运行此作业可能不现实。状态转换需要我回顾 30 天的数据,所以我确实需要回顾整个查询的历史。

可能的解决方案:

以下是一些我认为可能可行的解决方案,我想就我的情况获得最有意义的反馈。

运行一个查看最近更新的 Python 脚本,并以 cron 作业的形式查询 30 天的大型历史记录表,并将结果发送到 redshift 数据库中的一个表。 具体化 SQL 视图并每小时运行一次增量刷新 将视图作为数据源放入 Tableau 中,并每小时运行一次增量刷新

请告诉我你将如何解决这个问题。我的知识是 SQL、有限的数据工程经验、Tableau(Prep 和桌面)以及 Python 或 R 脚本。

【问题讨论】:

【参考方案1】:

首先,您说数据处理“缓慢且效率低下”,并询问如何有效地查询大型数据库。首先,我会看看如何改进这个过程。您表示该过程基于过去 30 天的数据 - 是否对大型表进行时间排序、清理和分析?在处理大型表时,最大限度地利用元数据非常重要。确保您的 where 子句能够有效地消除事实表块 - 不要依赖维度表 where 子句来选择日期范围。

接下来查看您的分配键以及它们如何影响您的关键查询在网络中移动大量数据的需求。节点间网络在 Redshift 集群中具有最低的带宽,并且不必要地在其中推送大量数据会使事情变得缓慢和低效。根据您的查询模式,使用 EVEN 分布可能会成为性能杀手。

现在让我回答您的问题并解释一下 - “使用汇总表、物化视图或外部存储(tableau 数据源)来存储每小时更新的汇总数据更好吗?”所有 3 项工作,每个都有自己的优点和缺点。

    汇总表很好,因为您可以选择数据存储的分布,如果这些数据需要与其他数据库表组合,它可以最有效地完成。但是,需要执行更多的数据管理以使这些数据保持最新状态并保持同步。 物化视图很好,因为无需担心管理操作 - 当数据更改时,只需刷新视图即可。数据仍在数据库中,因此很容易与其他数据表合并,但由于您无法控制数据的存储,因此这些操作可能不是最有效的。 外部存储很好,因为数据在您的 BI 工具中,因此如果您需要在一小时内重新获取结果,则数据是本地的。但是,它并没有被锁定在您的 BI 工具中,并且与其他数据库表组合的效率要低得多。

摘要数据通常不会那么大,因此如何存储它并不是一个大问题,而且我有点懒,所以我会使用物化视图。就像我在开始时所说的那样,我首先会查看我每小时运行的“缓慢且低效”的查询。

希望对你有帮助

【讨论】:

以上是关于如何高效地按小时查询大型数据库?的主要内容,如果未能解决你的问题,请参考以下文章

如何改进热图的大型数据集的 KQL 查询

大型单表的 MySQL 查询优化 [关闭]

高效的 ORDER BY 与大型表上的依赖子查询

重写大型 IN 子句的最高效方法是啥?

在 SQL Server 中调整大型查询

如何高效地构建像 ChatGPT 这样的大型 AI 模型?