【问题标题】:How can I perform the same query on multiple tables in Redshift如何在 Redshift 中对多个表执行相同的查询
【发布时间】:2021-11-16 03:22:28
【问题描述】:

我在 Redshift 的 SQL Workbench 中工作。我们为客户帐户提供每日事件表,每天的格式相同,只是更新了信息。目前有 300 多张桌子。举个简单的例子,我想从每个表中提取前 10 行并将它们放在 1 个表中。

表名格式为 Events_001、Events_002 等。典型值为 Customer_ID 和 Balance。

Redshift 似乎不支持声明变量,所以我有点卡住了。

【问题讨论】:

  • 你不应该那样做。不要一直生成表。应该修复表结构。

标签: sql amazon-redshift workbench


【解决方案1】:

您有效地发明了一种伪分区;您可以在其中手动按天对数据进行分区。

要手动重新组合表格,请创建一个视图以将所有内容合并在一起...

CREATE VIEW
  events_combined
AS
  SELECT 1 AS partition_id, * FROM events_001
  UNION ALL
  SELECT 2 AS partition_id, * FROM events_002
  UNION ALL
  SELECT 3 AS partition_id, * FROM events_003
  etc, etc

这很麻烦,每次添加新表时都需要重新创建视图。

这就是为什么大多数现代数据库都内置了分区方案,因此所有样板文件都为您处理好了。

但 RedShift 不这样做。那么,为什么不呢?

一般来说,因为 RedShift 有许多用于划分和征服数据的替代机制。它是柱状的,因此您可以避免阅读不使用的列。它在多个节点上水平分区(分片),以与大量数据分担负载。它在页面中进行排序和压缩,以避免加载您不想要或不需要的行。它有用于新到达数据的脏页,然后可以使用VACUUM 进行清理。

所以,我同意其他人的观点,即这不是 正常 的做法。然而,亚马逊自己确实有一个帮助页面(简要地)描述了您的用例。

所以,我不同意“永远不要这样做”。不过,这强烈表明您不小心进入了反模式,应该认真重新考虑您的设计。

【讨论】:

  • 谢谢大家的回答,超级有帮助。我只在公司工作了几个星期,必须承认这是我第一次遇到这种表格结构。值得建议修改方法作为我的第一个停靠港。
【解决方案2】:

正如其他人所指出的那样,Redshift 中的许多小表确实效率低下,如果走极端就会很糟糕。但这不是你的问题。

您想知道如何从 SQL Workbench 对多个表执行相同的查询。我假设您指的是 SQLWorkbench/J。如果是这样,您可以在工作台中定义变量并在查询中使用这些变量。然后您只需要更新变量并重新运行查询。现在 SQLWorkbench/J 不提供任何循环或脚本功能。如果要循环,则需要将工作台包装在脚本中(例如 BAT 文件或 bash 脚本)。

我的偏好是编写一个 jinja 模板,其中包含 SQL 以及任何循环和变量替换。然后应用一个带有表名的 json,然后你就拥有了一个文件中所有表的所有 SQL。我只需要运行它 - 通常使用 psql cli,但有时我会将其导入我的工作台。

我的建议是将 Redshift 视为查询执行引擎,并使用外部环境(Lambda、EC2 等)来编排要运行的查询以及何时运行。许多其他数据库(尝试)在数据库功能内部提供完整的操作环境。将此模式应用于 Redshift 通常会导致问题。将 Redshift 用于它擅长的领域,并在其他地方执行其他操作。最后你会发现 AWS 的大生态系统提供了与其他数据库相比的扩展能力,只是这些并不是在 Redshift 内部完成的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    • 1970-01-01
    相关资源
    最近更新 更多