Amazon Redshift 性能优化指南:VACUUM、ANALYZE 与运维最佳实践

Amazon Redshift 数据仓库性能优化完全指南,详解 VACUUM 六种类型(FULL、DELETE ONLY、SORT ONLY、REINDEX、RECLUSTER、BOOST)、ANALYZE 统计更新、表设计最佳实践和常用运维命令。

Bruce

RedshiftAWS数据仓库性能优化VACUUM

数据仓库

642 Words

2018-08-09 08:03 +0000


Amazon Redshift 数据仓库性能优化指南

Amazon Redshift 是 AWS 推出的云端数据仓库服务,采用列式存储和大规模并行处理(MPP)架构,能够在 PB 级数据上实现亚秒级查询响应。但随着数据不断写入和删除,表的性能会逐渐下降——这时就需要 VACUUM 和 ANALYZE 来维护。

本文将系统讲解 Redshift 的性能优化策略,包括 VACUUM 的六种类型、ANALYZE 统计更新,以及日常运维中的实用命令。

一、为什么需要 VACUUM?

Redshift 的存储机制有两个特点会导致性能下降:

1. 删除不会立即释放空间

当你执行 DELETEUPDATE 时,Redshift 不会物理删除数据,只是将这些行标记为"已删除"。这些"幽灵行"仍然占用磁盘空间,查询时也可能被扫描到。

2. 新数据存储在未排序区域

使用 COPYINSERTUPDATE 插入的新行,会存储在表末尾的未排序区域。如果表定义了排序键(Sort Key),但大量数据未排序,范围扫描和合并连接的效率会大打折扣。

类比理解:就像一本字典,如果新词都堆在最后几页而不按字母排序,查词效率自然会下降。


二、VACUUM 命令详解

VACUUM 命令用于回收空间和重新排序数据。Redshift 提供了 6 种 VACUUM 类型,适用于不同场景。

数据中心服务器架构

VACUUM 类型对比表

类型功能适用场景耗时
FULL排序 + 回收空间通用维护(默认)中等
DELETE ONLY仅回收空间大量删除后
SORT ONLY仅排序大量插入后中等
REINDEX重建交错排序索引交错排序键表最慢
RECLUSTER仅排序未排序部分大表增量维护
BOOST使用额外资源加速维护窗口期快(占资源)

1. VACUUM FULL(默认)

排序数据并回收已删除行的空间,是最常用的维护命令。

-- 对单表执行完整 VACUUM
VACUUM sales;

-- 对整个数据库执行(谨慎使用)
VACUUM;

执行条件:默认情况下,当已排序行超过 95% 时会跳过排序阶段。可通过 TO threshold PERCENT 参数调整:

-- 强制完全排序(不跳过)
VACUUM sales TO 100 PERCENT;

-- 当 75% 以上已排序时跳过
VACUUM sales TO 75 PERCENT;

2. VACUUM DELETE ONLY

仅回收被标记删除的行所占空间,不进行排序。适合大量删除数据后快速释放空间。

VACUUM DELETE ONLY sales;

提示:Redshift 会在后台自动执行 DELETE ONLY 操作,但手动执行可以更快释放空间。

3. VACUUM SORT ONLY

仅对未排序区域进行排序,不回收空间。适合大量插入后提升查询性能。

VACUUM SORT ONLY sales;

4. VACUUM REINDEX

针对使用**交错排序键(Interleaved Sort Key)**的表。它会重新分析排序键列的值分布,然后执行完整 VACUUM。

VACUUM REINDEX listing;

注意事项

  • 执行时间比 VACUUM FULL 长很多
  • 仅对交错排序键表有意义
  • 如果初始加载使用 INSERT 而非 COPY,需要运行此命令初始化索引

5. VACUUM RECLUSTER

只对表的未排序区域进行排序,保持已排序部分不变。适合大表的增量维护。

VACUUM RECLUSTER listing;

优势

  • 比 FULL 更快
  • 对大表更友好
  • AWS 推荐用于频繁写入、只查询最新数据的场景

6. VACUUM BOOST

使用额外系统资源加速 VACUUM 操作,但会阻止并发的 DELETE 和 UPDATE

-- 加速 RECLUSTER
VACUUM RECLUSTER listing BOOST;

-- 加速 FULL
VACUUM FULL sales BOOST;

最佳实践:仅在维护窗口或低峰期使用 BOOST。


三、VACUUM 执行策略

1. 选择合适的 VACUUM 类型

               ┌─────────────────────────────────────┐
               │         需要维护的表                │
               └──────────────┬──────────────────────┘
              ┌───────────────┼───────────────┐
              ▼               ▼               ▼
        大量删除后       大量插入后      交错排序键表
              │               │               │
              ▼               ▼               ▼
        DELETE ONLY      SORT ONLY        REINDEX
              │               │               │
              └───────┬───────┘               │
                      ▼                       │
              两者都需要?                    │
                      │                       │
                      ▼                       │
                    FULL ◄────────────────────┘

2. 判断是否需要 VACUUM

查询 SVV_TABLE_INFO 视图获取表的排序和空间使用状态:

SELECT
    "table",
    size AS size_mb,
    pct_used,
    tbl_rows,
    unsorted,
    vacuum_sort_benefit
FROM SVV_TABLE_INFO
WHERE unsorted > 5  -- 未排序比例超过 5%
ORDER BY size_mb DESC;

关键指标

  • unsorted:未排序行的百分比
  • vacuum_sort_benefit:预估 VACUUM 后的性能提升
  • pct_used:磁盘使用率

3. 监控 VACUUM 进度

VACUUM 执行期间,查看预估剩余时间:

SELECT * FROM SVV_VACUUM_PROGRESS;

VACUUM 完成后,查看执行效果:

SELECT
    table_name,
    elapsed_time/1000000 AS elapsed_seconds,
    sort_partitions,
    row_delta,
    block_delta
FROM SVV_VACUUM_SUMMARY
ORDER BY xid DESC
LIMIT 10;

查看空间回收率:

SELECT * FROM SVL_VACUUM_PERCENTAGE ORDER BY xid DESC;

四、ANALYZE 统计更新

ANALYZE 命令更新表的统计元数据,帮助查询优化器生成更准确的执行计划。

1. 何时运行 ANALYZE

  • 大量 INSERT、UPDATE、DELETE 后
  • VACUUM 操作完成后
  • stats_off 指标超过 10% 时
-- 分析单表
ANALYZE sales;

-- 分析整个数据库
ANALYZE;

-- 仅更新谓词列的统计信息
ANALYZE PREDICATE COLUMNS sales;

2. 检查统计是否过时

SELECT
    "table",
    stats_off
FROM SVV_TABLE_INFO
WHERE stats_off > 10
ORDER BY stats_off DESC;

注意COPY 命令加载空表后会自动运行 ANALYZE,无需手动执行。


五、表设计最佳实践

良好的表设计可以大幅减少 VACUUM 的频率和耗时。

1. 选择合适的排序键

排序键类型适用场景VACUUM 策略
复合排序键范围查询、时间序列VACUUM FULL
交错排序键多列等值过滤VACUUM REINDEX
无排序键全表扫描为主VACUUM DELETE ONLY

推荐:日期/时间列作为第一排序键,配合按时间顺序加载数据,可以最小化排序需求。

2. 按排序键顺序加载数据

如果使用 COPY 并满足以下条件,Redshift 会自动将新数据放入已排序区域:

  • 使用复合排序键且只有一列
  • 排序列为 NOT NULL
  • 表 100% 已排序或为空
  • 新数据的排序值都大于现有数据

3. 大表拆分为时间序列表

对于超大表,按时间拆分可以:

  • 减少单表 VACUUM 耗时
  • 方便删除历史数据(直接 DROP 分区表)
  • 提升查询裁剪效率
-- 按月分表示例
CREATE TABLE sales_2024_01 (LIKE sales);
CREATE TABLE sales_2024_02 (LIKE sales);
-- ...

4. Deep Copy 替代 VACUUM

对于大表,深拷贝可能比 VACUUM 更快:

-- 1. 创建新表
CREATE TABLE sales_new (LIKE sales);

-- 2. 批量插入(自动排序)
INSERT INTO sales_new SELECT * FROM sales;

-- 3. 重命名替换
ALTER TABLE sales RENAME TO sales_old;
ALTER TABLE sales_new RENAME TO sales;

-- 4. 删除旧表
DROP TABLE sales_old;

注意:Deep Copy 期间不能有并发写入。


六、常用运维命令速查

表信息查询

-- 查看所有表的详细信息
SELECT
    "table",
    size AS size_mb,
    pct_used,
    tbl_rows,
    encoded,
    diststyle,
    sortkey_num,
    sortkey1,
    unsorted,
    stats_off
FROM SVV_TABLE_INFO
ORDER BY size_mb DESC;

压缩编码分析

-- 分析表的最佳压缩编码
ANALYZE COMPRESSION sales;

错误排查

-- 查看 COPY 加载错误
SELECT * FROM STL_LOAD_ERRORS ORDER BY starttime DESC LIMIT 20;

-- 查看查询执行错误
SELECT * FROM STL_ERROR ORDER BY recordtime DESC LIMIT 20;

查询性能分析

-- 查看最近的慢查询
SELECT
    query,
    substring(querytxt, 1, 100) AS query_text,
    elapsed/1000000 AS elapsed_seconds,
    queue_time/1000000 AS queue_seconds
FROM STL_QUERY
WHERE elapsed > 60000000  -- 超过 60 秒
ORDER BY endtime DESC
LIMIT 20;

七、自动化维护工具

AWS 提供了开源的 Analyze Vacuum Utility,可以自动识别需要维护的表并执行 VACUUM 和 ANALYZE。

主要功能

  • 基于 unsortedstats_off 和表大小自动判断
  • 支持按 Schema 或单表执行
  • 提供详细的执行日志

基本用法

python analyze-vacuum-schema.py \
    --db mydb \
    --db-user admin \
    --db-host mycluster.xxx.redshift.amazonaws.com \
    --schema-name public \
    --vacuum-flag true \
    --analyze-flag true

总结

Amazon Redshift 性能优化的核心是理解数据存储机制,并制定合理的维护策略:

  1. 定期 VACUUM:回收空间、保持排序,选择合适的 VACUUM 类型
  2. 及时 ANALYZE:更新统计信息,帮助优化器生成最佳执行计划
  3. 合理设计表:选择正确的排序键和分布键,按排序顺序加载数据
  4. 监控关键指标:关注 unsortedstats_offvacuum_sort_benefit
  5. 善用工具:利用 Analyze Vacuum Utility 实现自动化维护

掌握这些技巧,你的 Redshift 集群将持续保持高性能状态。


相关阅读

参考资料

Comments

Join the discussion — requires a GitHub account