当前位置: 首页 > news >正文

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回复,未经尝试,待进一步验证使用。

虽一知半解,但先记录使用,感谢查阅与批评!

 

http://www.rkmt.cn/news/647.html

相关文章:

  • ZeroGPU Spaces 加速实践:PyTorch 提前编译全解析
  • 基于yolo12对目标物体进行自动裁剪和模糊打码
  • 2025.9.9数学课
  • 【Git】在更新项目时“将传入更改合并到当前分支“和”在传入更改上变基当前分支“有什么区别
  • 国内开发者如何选择代码管理平台?Gitee、GitHub等主流工具深度解析
  • 【Git】常见的 commit type 及用法
  • 【IEEE出版】第六届机器学习与计算机应用国际学术会议
  • 跨网文件摆渡软件如何选择?企业数字化转型的关键决策指南!
  • Avalonia 学习笔记02. Fonts and Animations(字体和动画) (转载)
  • 【IEEE出版】第九届电气、机械与计算机工程国际学术会议(ICEMCE 2025)
  • 英语_阅读_useful resources_待读
  • 第五届现代教育技术与社会科学国际学术会议(ICMETSS 2025)
  • 梅剑华:人工智能与因果推断——兼论奇点问题(哈哈,Why框架就是)
  • 真行!Claude 全面封禁中国。。
  • 质量QE的关键四个角色(DQE、SQE、PQE和CQE)
  • 剑指offer-28、数组中出现次数超过⼀半的数字
  • Redis是如何高效管理有限内存的?
  • PB9的数据窗口中文说明
  • PyPI包名的命名规则与pip的兼容性机制——为什么pip install sCIKit.-_LEarN也能成功
  • 一种简单粗暴的网页代理模式
  • 直播App源码功能大揭秘:主播PK、连麦互动与邀请奖励的技术与魅力
  • 这款开源调研系统越来越“懂事”了
  • qoj7511 Planar Graph
  • 30条顶级APT与蓝队攻防单行命令:网络战场终极对决
  • CF2138D
  • QBot - *--_
  • 222
  • 为Unity开发者准备的虚幻引擎指南
  • mtgsig1.2 4.03 分析
  • 内核知识地图