Redshift 查询每日生成的表

Posted

技术标签:

【中文标题】Redshift 查询每日生成的表【英文标题】:Redshift query a daily-generated table 【发布时间】:2016-06-16 01:53:22 【问题描述】:

我正在寻找一种创建 Redshift 查询的方法,该查询将从每天生成的表中检索数据。我们集群中的表格式如下:

event_table_2016_06_14
event_table_2016_06_13 

..等等。

我尝试编写一个查询,将当前日期附加到表名,但这似乎不能正常工作(无效操作):

SELECT * FROM concat('event_table_', to_char(getdate(),'YYYY_MM_DD'))

非常感谢任何有关如何执行此操作的建议!

【问题讨论】:

我面临同样的问题,并试图找出最好的方法。如果您能分享您的经验,那就太好了。 【参考方案1】:

我尝试编写一个查询,将当前日期附加到 表名,但这似乎无法正常工作(无效 操作):

Redshift 不支持。但你很可能不需要它。

尝试以下方法(扩展来自@ketan 的答案):

    使用适当的(用于连接)DIST 键、COMPOUND 或简单的 SORT KEY 在时间戳列上创建主表,并对列进行适当的压缩。

    每天,创建一个临时表(使用 CREATE TABLE ... LIKE - 这将保留 DIST/SORT 键),用每日数据加载它,VACUUM SORT

    使用 ALTER TABLE APPEND已排序 临时表复制到主表中 - 这将复制已排序的数据,并减少主表上的 VACUUM。之后你可能还需要VACUUM SORT

之后正常查询您的主表,可能会给它一个时间戳范围。 Redshift 针对这些场景进行了优化,并且 99% 的时间您不需要自己优化表扫描——即使在具有数十亿行扫描的表上也需要几毫秒到几秒的时间。您可能需要在其他地方进行优化,但这是第二步。

要深入了解扫描的性能,请使用 STL_QUERY 系统表查找您的查询 ID,然后使用 STL_SCAN(或 SVL_QUERY_SUMMARY)表查看扫描的速度。

您的示例实际上是ALTER TABLE APPEND 的主要用例。

【讨论】:

【参考方案2】:

我假设您每天都在创建一个新表。

你可以做的是:

    Create a view 在event_table_* 表之上。使用此视图查询您的数据。 无论何时创建或删除表,都要更新视图。

如果您愿意,您可以避免 #2:与其每天创建新表,不如为接下来的 1-2 年创建空表。因此,无需每天更新视图。但是,请记住,Redshift 中有 9,900 个表中的 limit 较高。

编辑:如果您总是需要查询今天的表格(而不是我最初假设的所有表格),我认为您不能在不更新视图的情况下执行此操作。

但是,您可以将设计修改为只有一张表,并将date 作为排序键。因此,每当您的表被一些date 查询时,所有没有date 的磁盘块都将被跳过。这将与拥有时间序列表一样有效。

【讨论】:

对,但最终我不想每天都更新视图。我正在尝试找到一种方法让 SQL 自动在表名中使用今天的日期。 我认为没有办法做到这一点 你的问题不是很清楚。如果你只需要看看今天的数据,为什么要创建时间序列表。只需创建一个表,日期为排序键。这样就足够高效了

以上是关于Redshift 查询每日生成的表的主要内容,如果未能解决你的问题,请参考以下文章

如何将密码存储在 Redshift 的表中?

如何在没有连接的情况下为 postgres (Redshift) 生成 SQL 查询?

如何在 Redshift 中安排 DDL 定义视图(pg_catalog 表)的每日备份

在 Redshift 中查找常用连接查询

使用 lambda 函数 nodejs 从 Amazon Redshift 查询选择

使用 Python 和 Airflow 在电子邮件中发送 Redshift 查询结果