如何按小时高效查询大型数据库?
How to efficiently query a large database on a hourly basis?
背景:
我有多个资产 tables 存储在每个城市的红移数据库中,总共 8 个城市。这些资产 table 每小时显示一次状态更新。 8 SQL tables 和一年约 5 亿行数据。
(我还可以访问每分钟更新此数据的服务器。)
Example: One market can have 20k assets displaying 480k (20k*24 hrs) status updates a day.
这些状态更新是原始格式,需要经过一个转换过程,目前是在SQL 视图中编写的。最终状态将进入我们的 BI 工具 (Tableau),供外部利益相关者查看。
问题:
当前处理数据的方式缓慢且效率低下,对于 运行 在 Tableau 中按小时计算的这项工作可能不现实。状态转换要求我回看30天的数据,所以我确实需要回看整个查询的历史。
可能的解决方案:
以下是一些我认为可能有效的解决方案,我希望就我的情况最合理的解决方案获得反馈。
- 运行 一个 python 脚本,它查看最近的更新并查询大量历史 table 30 天作为 cron 作业并将结果发送到 table 在 redshift 数据库中。
- 具体化 SQL 视图并运行 每小时增量刷新
- 将视图作为数据源放入 Tableau 中,运行 每小时进行一次增量刷新
请告诉我您将如何解决这个问题。我的知识是 SQL,有限的数据工程经验,Tableau(Prep & Desktop)和 Python 或 R 中的脚本。
So first things first - 你说数据处理是"slow and inefficient" 并询问如何高效地查询大型数据库。首先,我会看看如何改进这个过程。您指出该过程是基于过去 30 天的数据 - table 大的时间是否已排序、清理和分析?在处理大型 table 时,充分利用元数据非常重要。确保您的 where 子句在消除事实 table 块方面有效 - 不要依赖维度 table where 子句到 select 日期范围。
接下来查看您的分布键,以及它们如何影响您的关键查询在网络中移动大量数据的需求。节点间网络在 Redshift 集群中具有最低的带宽,不必要地在其中推送大量数据会使事情变慢且效率低下。根据您的查询模式,使用 EVEN 分布可能会成为性能杀手。
现在让我回答您的问题并解释一下 - "is it better to use summary tables, materialized views, or external storage (tableau datasource) to store summary data updated hourly?" 所有 3 种方法都有效,各有优缺点。
- 总结tables很好,因为你可以select数据存储的分布,如果这个数据需要和其他数据库结合tables它可以做到最有效率的。但是,需要执行更多的数据管理才能使这些数据保持最新和同步。
- 物化视图很好,因为需要担心的管理操作要少得多 - 当数据更改时,只需刷新视图即可。数据仍在数据库中,因此很容易与其他数据合并 tables 但由于您无法控制数据的存储,因此这些操作可能不是最有效的。
- 外部存储的好处在于数据在您的 BI 工具中,因此如果您需要在一小时内重新获取结果,数据是本地的。但是,它并未锁定在您的 BI 工具中,并且与其他数据库 table 结合的效率要低得多。
摘要数据通常不会那么大,因此它的存储方式并不是一个大问题,而且我有点懒惰,所以我会使用物化视图。就像我在开始时所说的那样,我会首先查看 "slow and inefficient" 个查询,我首先每小时 运行。
希望对您有所帮助
背景:
我有多个资产 tables 存储在每个城市的红移数据库中,总共 8 个城市。这些资产 table 每小时显示一次状态更新。 8 SQL tables 和一年约 5 亿行数据。 (我还可以访问每分钟更新此数据的服务器。)
Example: One market can have 20k assets displaying 480k (20k*24 hrs) status updates a day.
这些状态更新是原始格式,需要经过一个转换过程,目前是在SQL 视图中编写的。最终状态将进入我们的 BI 工具 (Tableau),供外部利益相关者查看。
问题:
当前处理数据的方式缓慢且效率低下,对于 运行 在 Tableau 中按小时计算的这项工作可能不现实。状态转换要求我回看30天的数据,所以我确实需要回看整个查询的历史。
可能的解决方案:
以下是一些我认为可能有效的解决方案,我希望就我的情况最合理的解决方案获得反馈。
- 运行 一个 python 脚本,它查看最近的更新并查询大量历史 table 30 天作为 cron 作业并将结果发送到 table 在 redshift 数据库中。
- 具体化 SQL 视图并运行 每小时增量刷新
- 将视图作为数据源放入 Tableau 中,运行 每小时进行一次增量刷新
请告诉我您将如何解决这个问题。我的知识是 SQL,有限的数据工程经验,Tableau(Prep & Desktop)和 Python 或 R 中的脚本。
So first things first - 你说数据处理是"slow and inefficient" 并询问如何高效地查询大型数据库。首先,我会看看如何改进这个过程。您指出该过程是基于过去 30 天的数据 - table 大的时间是否已排序、清理和分析?在处理大型 table 时,充分利用元数据非常重要。确保您的 where 子句在消除事实 table 块方面有效 - 不要依赖维度 table where 子句到 select 日期范围。
接下来查看您的分布键,以及它们如何影响您的关键查询在网络中移动大量数据的需求。节点间网络在 Redshift 集群中具有最低的带宽,不必要地在其中推送大量数据会使事情变慢且效率低下。根据您的查询模式,使用 EVEN 分布可能会成为性能杀手。
现在让我回答您的问题并解释一下 - "is it better to use summary tables, materialized views, or external storage (tableau datasource) to store summary data updated hourly?" 所有 3 种方法都有效,各有优缺点。
- 总结tables很好,因为你可以select数据存储的分布,如果这个数据需要和其他数据库结合tables它可以做到最有效率的。但是,需要执行更多的数据管理才能使这些数据保持最新和同步。
- 物化视图很好,因为需要担心的管理操作要少得多 - 当数据更改时,只需刷新视图即可。数据仍在数据库中,因此很容易与其他数据合并 tables 但由于您无法控制数据的存储,因此这些操作可能不是最有效的。
- 外部存储的好处在于数据在您的 BI 工具中,因此如果您需要在一小时内重新获取结果,数据是本地的。但是,它并未锁定在您的 BI 工具中,并且与其他数据库 table 结合的效率要低得多。
摘要数据通常不会那么大,因此它的存储方式并不是一个大问题,而且我有点懒惰,所以我会使用物化视图。就像我在开始时所说的那样,我会首先查看 "slow and inefficient" 个查询,我首先每小时 运行。
希望对您有所帮助