我正在寻找一种方法来创建一个Redshift查询,该查询将从每天生成的表中检索数据。我们群集中的表格形式如下:
event_table_2016_06_14
event_table_2016_06_13
..等等。
我尝试编写一个将当前日期附加到表名的查询,但这似乎无法正常工作(无效操作):
SELECT * FROM concat('event_table_', to_char(getdate(),'YYYY_MM_DD'))
非常感谢有关如何执行此操作的任何建议!
答案 0 :(得分: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的主要用例。
答案 1 :(得分:0)
我假设你每天都在创造一张新桌子。
你能做的是:
event_table_*
个表格之上。使用此视图查询您的数据。
如果您愿意,可以避免#2:不是每天创建一个新表,而是在未来1 - 2年内创建空表。因此,无需每天更新视图。但是,请记住Redshift中有9,900个表的上limit。
编辑:如果你总是需要查询今天的表格(而不是我原先假设的所有表格),我认为如果不更新你的观点,你就不能这样做。
但是,您可以将设计修改为只有一个表,date
作为排序键。因此,每当使用某些date
查询表时,将跳过所有没有date
的磁盘块。这将与拥有时间序列表一样高效。