由于redshift本身不支持日期分区,所以除了redshift频谱外,我们所有的表都进行了日期分区
my_table_name_YYYY_MM_DD
所以每次我们查询时,通常看起来都是这样
select columns, i, want from
(select * from tbl1_date UNION ALL
select * from tbl2_date UNION ALL
select * from tbl3_date UNION ALL
select * from tbl4_date);
每天有一个UNION ALL。
存储过程可以生成日期范围吗,所以当我向他们发送python或bash脚本来生成日期范围时,我们的业务分析师就不会失去头发吗?
答案 0 :(得分:0)
是的,您可以创建一个存储过程,该存储过程仅使用所需的表来生成动态SQL。请在这里查看我的答案,以获取以下模板作为模板:Issue with passing column name as a parameter to "PREPARE" in Redshift
但是,您应该意识到Redshift可以使用“时间序列表”视图自动实现您想要的大部分功能。记录在这里:
您定义一个视图,该视图由一系列相同表上的UNION ALL组成,并在通常过滤的日期或时间戳列上定义了排序键。当您查询该视图时,Redshift可以消除对不包含相关数据的所有UNION表的扫描。
例如:
CREATE OR REPLACE VIEW store_sales_vw
AS SELECT * FROM store_sales_1998
UNION ALL SELECT * FROM store_sales_1999
UNION ALL SELECT * FROM store_sales_2001
UNION ALL SELECT * FROM store_sales_2002
UNION ALL SELECT * FROM store_sales_2003
;
SELECT cd.cd_education_status
,COUNT(*) sales_count
,AVG(ss_quantity) avg_quantity
FROM store_sales_vw vw
JOIN customer_demographics cd
ON vw.ss_cdemo_sk = cd.cd_demo_sk
WHERE ss_sold_ts BETWEEN '1999-09-01' AND '2000-08-31'
GROUP BY cd.cd_education_status
在此示例中,Redshift将仅使用store_sales_1999
和store_sales_2000
表,而跳过视图中的其他表。请注意,表跳过不是基于表的名称。 Redshift知道每个表中排序键时间戳的MIN和MAX值。
如果您采用这种方法,请确保将UNION的总大小保持较低。我建议(最多)上周[7]的每日表格,上个月[5]的每周表格,去年[4]的季度表格以及旧数据的年度表格。
您可以使用ALTER TABLE … APPEND将每日表格合并到每周表格中,依此类推。