如何在 Redshift 中对多个表执行相同的查询

How can I perform the same query on multiple tables in Redshift

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

Table 名称格式为 Events_001、Events_002 等。典型值为 Customer_ID 和 Balance.

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

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

要手动重新组合 table 创建一个视图以将所有内容联合在一起...

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

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

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

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

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

清理

所以,我同意其他人的看法,这不是 正常 做法。然而,Amazon 本身确实有一个帮助页面(简要地)描述了您的用例。

所以,我不同意“永远不要这样做”。尽管如此,这仍然是一个强烈的迹象,表明您不小心进入了反模式,应该认真地重新考虑您的设计。

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

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

我的偏好是编写一个包含 SQL 以及任何循环和变量替换的神社模板。然后应用 json 和 table 名称,然后您在一个文件中拥有所有 table 的所有 SQL。我只需要 运行 这个——通常使用 psql cli,但有时我会将它导入我的工作台。

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