Redshift 查询每日生成 table

Redshift query a daily-generated table

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

event_table_2016_06_14
event_table_2016_06_13 

..等等

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

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

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

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

您可以做的是:

  1. Create a viewevent_table_* table 之上。使用此视图查询您的数据。
  2. 每当您创建或删除 table 时,都会更新视图。

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

编辑:如果你总是需要查询今天的table(而不是我最初假设的所有table),我不会认为您可以在不更新视图的情况下做到这一点。

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

I have tried writing a query that appends the current date to the table name, but this does not seem to work correctly (invalid operation):

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

尝试以下操作(扩展@ketan 的回答):

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

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

  3. 使用 ALTER TABLE APPENDsorted temp table 复制到 main table - 这将复制已排序的数据,并且将减少主要 table 上的 VACUUM。在那之后你可能还需要VACUUM SORT

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

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

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