【问题标题】:UNIONing dynamic list of tables in Redshift在 Redshift 中合并动态表列表
【发布时间】:2021-03-13 04:28:14
【问题描述】:

我在 Redshift 中有 100 多个表,我想通过 UNION 创建一个合并表。我不能对这个查询进行硬编码,因为表的列表会增长得很快。所以我希望能够实现一个过程,其中我能够编写类似“UNION all tables where the table name contains 'orders'”。

在 Redshift 中执行此操作的最佳方法是什么?如果需要,我愿意使用第三方工具/语言来执行此操作,但如果可能在 Redshift 中执行,那将是理想的。

【问题讨论】:

  • “表的列表会增长得很快”。您的数据模型有问题。您应该将所有数据放在一个表中 - 或者至少在每次添加新表时添加一个新视图。
  • @GordonLinoff 这是一个用例,每个表都有来自不同客户端的数据(并且单独授权)
  • 。 .然后你应该有一个步骤将数据加载到一个表中。
  • @GordonLinoff 这不是手动脚本。它是创建单独表格的第三方工具,因此我们无法直接控制它。这基本上是我的问题 - 我们现在如何将所有这些表中的数据放入一个表中?

标签: sql amazon-redshift


【解决方案1】:

我认为这不能在 Redshift 内部完成 - 我会让有好主意的人加入,但我认为没有办法。

因此,您将需要一个外部系统来为您编写查询。表名可以在 Redshift 目录中找到,并且可以在 jinja2 等模板系统中编写查询。 Jinja2 可以循环表列表并为您构建 UNION ALL SQL 并独立运行或作为 python 库运行。或者,您可以有一个进程 (Lambda) 为您的所有表构建一个视图,而您的查询只是访问该视图。

现在让我们谈谈为什么你不应该这样做。首先,Redshift 旨在高效处理大型表。存储块大小为 1MB,对于少于几百万行的表,效率可能非常低。一个 10,000 行的表可以使用不到 1% 的存储空间来存储实际数据,因此读取这些表可能会有很高的开销,如果您需要扫描其中的 100 个,您可以将所有时间都花在读取几乎没有使用的块上。这不仅在执行方面效率低下,而且在磁盘存储方面也是如此。你可能会在这条路上遇到大问题。

此外,Redshift 查询编译器对查询中的段和部分有限制。合并所有这些表将达到这些限制并在您前进和添加表时失败。定义一个有一天会中断的流程不太可能是您想要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多