Redshift如何创建更紧凑的临时表以减少存储空间占用?
问题描述
使用Redshift + Airflow,需从S3下载6类按小时拆分的报表(单类每日24个文件),涉及5个账户,每小时共需下载30个文件。为实现下载并行化,为每个报表和账户创建临时表(staging tables),通过COPY命令从S3导入数据,再通过APPEND操作合并至目标表,COPY与APPEND分属不同Airflow任务。
问题在于报表列数较多,Redshift块大小为1MB,临时表达5GB且数据稀疏,表大小增长前可插入4-5份同量级数据,操作示例如下:
-- Task 1 DROP TABLE IF EXISTS schema.wrk_acc_report_h_13_dt_2023_08_07; CREATE TABLE schema.wrk_acc_report_h_13_dt_2023_08_07 (LIKE schema.report_target_table); COPY schema.wrk_acc_report_h_13_dt_2023_08_07 (columns.....) FROM 's3://...../dt=2023-08-07/h=13' ACCESS_KEY_ID '12312323123' SECRET_ACCESS_KEY '12321313123' REGION '111111' CSV GZIP IGNOREHEADER 1 NULL 'null' TRUNCATECOLUMNS ACCEPTINVCHARS AS '?'; -- Task 2 ALTER TABLE schema.report_target_table APPEND FROM schema.wrk_acc_report_h_13_dt_2023_08_07 FILLTARGET;
执行APPEND后目标表急剧膨胀,每次加载新增25GB。VACUUM操作开销大且耗时,白天执行不合适;INSERT操作同样耗时。询问是否有更优方式创建临时表,使其更紧凑、占用更少存储空间?
优化方案
1. 优化临时表的存储结构
- 精简列数据类型:检查目标表的列定义,将冗余的大类型替换为更紧凑的类型,比如用
SMALLINT替代无需大范围的INT,VARCHAR(n)设为实际需要的最大长度而非默认的255,减少单条记录的存储空间,稀疏场景下效果更显著。 - 显式指定压缩编码:创建临时表时针对不同列的特征设置压缩编码,稀疏列用
ZSTD或LZO,重复值多的列用RUNLENGTH,示例:
CREATE TABLE schema.wrk_acc_report_h_13_dt_2023_08_07 ( col1 INT ENCODE ZSTD, col2 VARCHAR(50) ENCODE LZO, -- 其余列按数据特征配置编码 ) LIKE schema.report_target_table INCLUDING DEFAULTS;
- 改用Redshift临时表(TEMP TABLE):临时表存储在节点本地SSD,读写更快,且默认存储策略更紧凑,无需维护持久化元数据,会话结束后自动清理,无需手动DROP,修改创建语句:
CREATE TEMP TABLE wrk_acc_report_h_13_dt_2023_08_07 (LIKE schema.report_target_table);
2. 调整APPEND与加载流程
- 批量合并临时表后再APPEND:不要单张临时表单独执行APPEND,先将同小时、同类型的多张账户临时表合并到一张中间表,再执行一次APPEND到目标表,减少APPEND次数,降低数据碎片的产生。
- 关闭自动统计信息更新:APPEND操作会触发自动统计信息收集,增加额外开销,加载前先关闭:
ALTER TABLE schema.report_target_table SET AUTOSTATS_ENABLED = FALSE;
加载完成后重新开启:
ALTER TABLE schema.report_target_table SET AUTOSTATS_ENABLED = TRUE;
3. 利用Redshift稀疏存储特性
- 切换为列存表并优化排序键:若目标表是行存表,改为列存表可大幅提升稀疏数据的存储效率;同时设置合适的排序键(如按
dt和h),让APPEND的数据尽量填充到现有数据块,减少碎片。 - 开启列稀疏存储:对包含大量NULL值的列启用稀疏存储,Redshift会自动跳过NULL值的存储,节省空间:
ALTER TABLE schema.wrk_acc_report_h_13_dt_2023_08_07 ALTER COLUMN sparse_column SET SPARSE;
内容的提问来源于stack exchange,提问作者Andrew B
相关产品推荐
相关产品推荐

