Redshift查询每日生成的表

时间:2016-06-16 01:53:23

标签: postgresql amazon-redshift

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

event_table_2016_06_14
event_table_2016_06_13 

..等等。

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

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

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

2 个答案:

答案 0 :(得分:1)

  

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

Redshift不支持这一点。但你很可能不会需要它。

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

  1. 使用适当的(用于连接)DIST键和时间戳列上的COMPOUND或简单SORT KEY以及列上的正确压缩来创建主表。

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

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

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

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

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

答案 1 :(得分:0)

我假设你每天都在创造一张新桌子。

你能做的是:

    {li> Create a view位于event_table_*个表格之上。使用此视图查询您的数据。
  1. 每当您创建或删除表时,请更新视图。
  2. 如果您愿意,可以避免#2:不是每天创建一个新表,而是在未来1 - 2年内创建空表。因此,无需每天更新视图。但是,请记住Redshift中有9,900个表的上limit

    编辑:如果你总是需要查询今天的表格(而不是我原先假设的所有表格),我认为如果不更新你的观点,你就不能这样做。

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

相关问题