Zone maps和Sort key

Zone maps

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 3block5

上面的zone maps的最小最小值可能会有重叠的情况,所以这就引出了Sort key

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:

image-20221030092651867

Compound sort key与Interleaved sort key

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

原因:

  1. Interleaved VACUUM 成本太高
  2. 大表维护困难
  3. 加载变慢
  4. Compound 配合好的查询设计足够用