Zone maps是在内存中的block metadata,存储了每个block(每个block是1MB)的最大和最小值,当执行查询时,redshift先访问zone map,如果where 条件里的判断不在zone map范围里,就对该block不进行查询,这样可以减少不必要的IO
例如下面是一个zone map示例:
| Block | Low Value | High Value |
|---|---|---|
| 1 | 413 | 911 |
| 2 | 454 | 513 |
| 3 | 253 | 862 |
| 4 | 326 | 644 |
| 5 | 36 | 850 |
如果查询这个表中小于255的值,从zone maps里看到只需要查询block 3和block5
上面的zone maps的最小最小值可能会有重叠的情况,所以这就引出了Sort key
当创建表时,可以指定一个或多个列当作sort key, 当数据加载到表中时,会以顺序存储。在执行查询时,query planner会使用这些信息来加速查询。
Redshift每个磁盘的块存储是1MB,每个block上保存着最大值和最小值的元数据。如果使用range查询,则根据这些最大值和最小值,能够快速跳过不需要查询的数据块。
对于sortkey,每个block的zone map不会重叠,就像这样:
| Block | Low Value | High Value |
|---|---|---|
| 1 | 99 | 141 |
| 2 | 141 | 336 |
| 3 | 336 | 376 |
| 4 | 376 | 419 |
| 5 | 419 | 435 |
例如,下面的查询,在设置sort key前,需要扫描三个block,而在设置sort key后,只需要扫描一个block:

Compound Sort Key(复合排序键)按列顺序依次排序,类似电话簿(先按姓排,同姓再按名排):
CREATE TABLE orders (
order_id INT,
order_date DATE,
customer_id INT,
amount DECIMAL
)
COMPOUND SORTKEY (order_date, customer_id);
数据排列:
order_date | customer_id | ...
─────────────┼─────────────┼────
2024-01-01 | 1001 | ← 先按 order_date 排
2024-01-01 | 1002 | ← 同日期再按 customer_id 排
2024-01-01 | 1003 |
2024-01-02 | 1001 |
2024-01-02 | 1005 |
2024-01-03 | 1002 |
...
查询起来:
order_date 优先
│
┌──────┴──────┐
▼ ▼
2024-01-01 2024-01-02
│ │
├── c1001 ├── c1001
├── c1002 ├── c1005
└── c1003 └── c1008
查 order_date = '2024-01-01' → 直接定位 ✅
查 customer_id = 1001 → 必须扫所有日期 ❌
Interleaved Sort Key(交错排序键)每列同等重要,为所有列组合建立索引:
CREATE TABLE orders (
order_id INT,
order_date DATE,
customer_id INT,
amount DECIMAL
)
INTERLEAVED SORTKEY (order_date, customer_id);
查询起来:
order_date 和 customer_id 交错索引
┌─────────────────────┐
│ Z-order 空间曲线 │
│ 各种组合都能快速 │
│ 定位 │
└─────────────────────┘
查 order_date = '2024-01-01' → 快 ✅
查 customer_id = 1001 → 也快 ✅
数据排列:使用 Z-order / 空间填充曲线,让各列组合查询都能利用排序
区别:
| 特性 | Compound | Interleaved |
|---|---|---|
| 排序方式 | 按列顺序依次排 | 所有列同等权重 |
| 第一列查询 | ⚡ 最快 | ✅ 快 |
| 第二列单独查 | ❌ 没帮助 | ✅ 快 |
| 任意列组合 | ⚠️ 看顺序 | ✅ 都快 |
| VACUUM 开销 | 低 | 高 |
| 加载速度 | 快 | 慢 |
| 维护成本 | 低 | 高 |
何时用哪个:
| 场景 | 推荐 |
|---|---|
| 查询总是以某列为主(如时间) | ✅ Compound |
| 查询模式固定、可预测 | ✅ Compound |
| 多列查询,无固定模式 | ⚠️ Interleaved(但考虑成本) |
| 数据频繁更新 | ✅ Compound(VACUUM 快) |
| 表很大(TB 级) | ✅ Compound(维护成本低) |
| Ad-hoc 查询,各列都可能过滤 | ⚠️ Interleaved |
AWS 官方建议大多数情况下推荐 Compound Sort Key
原因: