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

Amazon Redshift 是 AWS 推出的云端数据仓库服务,采用列式存储和大规模并行处理(MPP)架构,能够在 PB 级数据上实现亚秒级查询响应。但随着数据不断写入和删除,表的性能会逐渐下降——这时就需要 VACUUM 和 ANALYZE 来维护。
本文将系统讲解 Redshift 的性能优化策略,包括 VACUUM 的六种类型、ANALYZE 统计更新,以及日常运维中的实用命令。
一、为什么需要 VACUUM?
Redshift 的存储机制有两个特点会导致性能下降:
1. 删除不会立即释放空间
当你执行 DELETE 或 UPDATE 时,Redshift 不会物理删除数据,只是将这些行标记为"已删除"。这些"幽灵行"仍然占用磁盘空间,查询时也可能被扫描到。
2. 新数据存储在未排序区域
使用 COPY、INSERT 或 UPDATE 插入的新行,会存储在表末尾的未排序区域。如果表定义了排序键(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。
主要功能
- 基于
unsorted、stats_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 性能优化的核心是理解数据存储机制,并制定合理的维护策略:
- 定期 VACUUM:回收空间、保持排序,选择合适的 VACUUM 类型
- 及时 ANALYZE:更新统计信息,帮助优化器生成最佳执行计划
- 合理设计表:选择正确的排序键和分布键,按排序顺序加载数据
- 监控关键指标:关注
unsorted、stats_off、vacuum_sort_benefit - 善用工具:利用 Analyze Vacuum Utility 实现自动化维护
掌握这些技巧,你的 Redshift 集群将持续保持高性能状态。
相关阅读
- AWS CLI 完全指南:安装配置与常用命令速查 - AWS 命令行工具使用教程
Comments
Join the discussion — requires a GitHub account