背景
之前公司做的一个消息中心功能优化的需求,我负责了其中一小部分。大致情况是这样的。
有一张历史消息表msg_message_list,存放近一年所有用户的消息记录,数据量是千万级的。因此设计的是一张按月的分区表。时间再往前,超过一年的历史消息则结转到另外一张msg_message_history表。
我负责的是历史数据的搬运,即把符合时间条件的数据从msg_message_list搬运到msg_message_history。采用的分区交换方式实现
整体实现步骤如下
- 首先对外提供了一个http的接口用于实现该功能,数据层调用数据库的存储过程。
- 在公司现有的平台上配置了一个定时调用该接口的任务。每天定时触发。
数据库的具体实现
因为一开始,同事就给我指明了方向,使用分区交换技术。所以我也没怎么纠结,就是看存储过程具体如何写了。
表和DDL
需要用到以下三张表,缺一不可
序号 | 表名 | 是否分区表 | 备注 |
---|---|---|---|
1 | MSG_MESSAGE_LIST | 是 | 过期数据的来源 |
– | – | – | – |
2 | MSG_MESSAGE_HISTORY | 是 | 过期数据的目的地 |
– | – | – | – |
3 | MSG_MESSAGE_TEMP | 否 | 分区交换时必须用到的临时表 |
表格中的三张表结构一样,只是除temp表外其他两张是分区表。ddl如下(部分字段省略):
CREATE TABLE "USERDB"."MSG_MESSAGE_LIST"
("MSG_ID" VARCHAR2(36) NOT NULL ENABLE,
"MSG_TITLE" VARCHAR2(128) NOT NULL ENABLE,
"MSG_BODY" VARCHAR2(2000) NOT NULL ENABLE,
"ACTION_URL" VARCHAR2(512),
"MSG_TIME" DATE NOT NULL ENABLE,
"OWNER_ID" VARCHAR2(50)
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
STORAGE(
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS"
PARTITION BY RANGE ("MSG_TIME") INTERVAL (NUMTOYMINTERVAL(1,'MONTH'<