You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 16:35:03