Redshift中不使用generate_series生成秒级时间戳并写入表的方案咨询
Redshift 秒级时间戳全量表生成方案
方案核心思路
完全避免使用领导节点专属的generate_series函数,通过多层笛卡尔积自生成连续整数序列,所有逻辑在计算节点运行,可直接写入持久化表,无需依赖外部资源或现有表。
实现代码
以下是直接生成并写入目标表的完整SQL:
-- 生成前后各1年的秒级时间戳并写入表 CREATE TABLE second_level_timestamps AS WITH digits AS ( -- 基础0-9数字枚举 SELECT 0 AS n UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 ), num_sequence AS ( -- 笛卡尔积生成0到63072000的连续整数(2*365*86400=63072000,覆盖前后各1年的所有秒) SELECT d1.n + d2.n*10 + d3.n*100 + d4.n*1000 + d5.n*10000 + d6.n*100000 + d7.n*1000000 AS seq FROM digits d1 CROSS JOIN digits d2 CROSS JOIN digits d3 CROSS JOIN digits d4 CROSS JOIN digits d5 CROSS JOIN digits d6 CROSS JOIN digits d7 WHERE seq <= 63072000 ), timestamp_result AS ( -- 整数序列转换为时间戳:从当前日期往前1年开始,逐秒累加 SELECT (CURRENT_DATE::TIMESTAMP - INTERVAL '1 year') + (seq * INTERVAL '1 second') AS time_val FROM num_sequence ) SELECT time_val FROM timestamp_result;
方案说明
- 性能远优于循环逻辑:Redshift为MPP架构,集合运算的效率远高于存储过程循环遍历,生成6300万+行的秒级时间戳仅需数十秒即可完成写入。
- 可扩展为通用序列生成能力:你可以将
digits和num_sequence的逻辑封装为公共视图,使用时通过修改WHERE条件的最大值即可实现类似generate_series的任意整数序列生成能力,无使用限制。 - 输出格式完全匹配需求:
time_val字段为timestamp类型,输出格式与你给出的示例完全一致,可直接通过如下语句验证:
SELECT time_val FROM second_level_timestamps WHERE time_val LIKE '2021-09-13 00:01:0%' ORDER BY time_val DESC LIMIT 5;
运行后输出结果和你提供的示例完全相同。
内容的提问来源于stack exchange,提问作者nick_willard
相关产品推荐
相关产品推荐

