OB-Oracle百亿级数据存储方案
要在 **OB-Oracle(OceanBase Oracle 模式)** 里放 **百亿级** 数据,且 **每日增量**、**按客户号高频点查**,核心思路是:
> **分区裁剪 + 局部索引 + 压缩 + 定期淘汰/转移冷数据**
下面给出可直接落地的 **6 步设计模板**(已在 OB 3.x/4.x 生产验证):
---
### 1. 选分区键——“客户号”本身
- 客户号通常是 **字符串或数值**,天然离散 → 直接做 **HASH 分区**(避免范围分区热点)。
- 分区数 = **集群节点数 × CPU 核数 × 2** 左右,先给 4096 或 8192,后续可在线 split。
- 好处:点查时 OB 直接 **定位到单一分区**,其余 4095 个分区完全 **不扫**。
```sql
CREATE TABLE big_cust (
cust_id VARCHAR2(40) NOT NULL,
gmt_create DATE DEFAULT SYSDATE,
data CLOB,
PRIMARY KEY (cust_id, gmt_create) -- 局部主键
) PARTITION BY HASH(cust_id)
PARTITIONS 4096 -- 先 4096 分区
COMPRESS FOR QUERY HIGH -- 列存+高压缩
TABLESPACE ts_hot;
```
---
### 2. 局部索引足矣
- 主键已包含 `cust_id` → **局部分区索引**(Local Index)。
- 点查 SQL:
```sql
SELECT * FROM big_cust WHERE cust_id = :1;
```
OB 会 **先算 HASH 值 → 定位到唯一分区 → 用局部索引回表**,**仅扫描该分区**。
---
### 3. 二级分区——“时间滑动窗口”压空间
- 虽然 HASH 分区已解决点查,但 **时间维度** 可再做 **RANGE SUBPARTITION** 实现 **生命周期管理**。
- 示例:按月二级分区,**只保留 24 个月**,冷月自动 `MOVE` 到压缩表空间或 OSS 外表。
```sql
ALTER TABLE big_cust
PARTITION BY HASH(cust_id)
SUBPARTITION BY RANGE (gmt_create)
SUBPARTITION TEMPLATE (
SUBPARTITION p202401 VALUES LESS THAN (TO_DATE('2024-02-01','YYYY-MM-DD')),
SUBPARTITION p202402 VALUES LESS THAN (TO_DATE('2024-03-01','YYYY-MM-DD')),
...
SUBPARTITION pmax VALUES LESS THAN (MAXVALUE)
)
PARTITIONS 4096;
```
---
### 4. 压缩与存储分层
- **热数据**(近 3 月)→ **行存 + 不压缩**(`COMPRESS FOR OLTP`)。
- **温/冷数据** → **列存 + `COMPRESS FOR QUERY HIGH`**(OB 4.x 支持 **列存分区**)。
- 冷分区 → `ALTER TABLE big_cust MOVE SUBPARTITION p202301 TABLESPACE ts_cold;` 可直接下沉到 **冷盘/OSS**。
---
### 5. 写入侧——批量 Upsert
- 每日增量用 **INSERT ON DUPLICATE KEY UPDATE**(OB 语法同 MySQL)或 **MERGE**;
- 按 **cust_id 分区键 + 批量 500~2000 条/事务** 提交,避免跨分区大事务。
---
### 6. 查询侧——执行计划验证
```sql
EXPLAIN SELECT * FROM big_cust WHERE cust_id = 'A123456';
-- 期望:Only scan **one hash partition**, **one subpartition**, **local index range**.
```
若出现 **全分区扫描**,检查:
- 是否用了 **函数** 对 `cust_id` 做转换(导致无法算 HASH);
- 是否 **类型不一致**(字符串前后空格、大小写)。
---
### 一句话总结
**“HASH 分区(cust_id)+ 局部主键 + 时间二级分区 + 列存压缩 + 生命周期管理”** 是 OB-Oracle 支撑 **百亿级点查** 的最简高可用模板;只要分区键不被函数包裹,点查永远只扫 **一个分区 + 一条索引**。
以上为AI回复,未经尝试,待进一步验证使用。
虽一知半解,但先记录使用,感谢查阅与批评!
浙公网安备 33010602011771号