风哥教程参考DB2官方文档Transaction Processing、Partitioning等内容,详细介绍交易流水存储、分区设计、查询优化等。更多视频教程www.fgedu.net.cn
目录大纲
Part01-交易流水存储概述
1.1 交易流水特点
交易流水特点:
- 数据量大:每日百万级记录
- 增长快:持续快速增长
- 查询多:频繁查询统计
- 保留久:长期保留历史数据
1.2 存储挑战
- 存储空间管理
- 查询性能优化
- 数据归档清理
- 备份恢复效率
Part02-分区表设计
2.1 按时间分区
CREATE TABLE TRANSACTION_LOG (
TRANS_ID VARCHAR(32) NOT NULL,
ACCOUNT_ID VARCHAR(32) NOT NULL,
TRANS_TYPE VARCHAR(20) NOT NULL,
TRANS_AMOUNT DECIMAL(18, 2) NOT NULL,
BALANCE_BEFORE DECIMAL(18, 2) NOT NULL,
BALANCE_AFTER DECIMAL(18, 2) NOT NULL,
TRANS_TIME TIMESTAMP NOT NULL DEFAULT CURRENT TIMESTAMP,
TRANS_STATUS VARCHAR(20) NOT NULL,
CONSTRAINT PK_TRANSACTION_LOG PRIMARY KEY (TRANS_ID, TRANS_TIME)
) PARTITION BY RANGE (TRANS_TIME)
(
PARTITION P202601 STARTING ‘2026-01-01’ ENDING ‘2026-01-31’,
PARTITION P202602 STARTING ‘2026-02-01’ ENDING ‘2026-02-28’,
PARTITION P202603 STARTING ‘2026-03-01’ ENDING ‘2026-03-31’,
PARTITION P202604 STARTING ‘2026-04-01’ ENDING ‘2026-04-30’
);
TRANS_ID VARCHAR(32) NOT NULL,
ACCOUNT_ID VARCHAR(32) NOT NULL,
TRANS_TYPE VARCHAR(20) NOT NULL,
TRANS_AMOUNT DECIMAL(18, 2) NOT NULL,
BALANCE_BEFORE DECIMAL(18, 2) NOT NULL,
BALANCE_AFTER DECIMAL(18, 2) NOT NULL,
TRANS_TIME TIMESTAMP NOT NULL DEFAULT CURRENT TIMESTAMP,
TRANS_STATUS VARCHAR(20) NOT NULL,
CONSTRAINT PK_TRANSACTION_LOG PRIMARY KEY (TRANS_ID, TRANS_TIME)
) PARTITION BY RANGE (TRANS_TIME)
(
PARTITION P202601 STARTING ‘2026-01-01’ ENDING ‘2026-01-31’,
PARTITION P202602 STARTING ‘2026-02-01’ ENDING ‘2026-02-28’,
PARTITION P202603 STARTING ‘2026-03-01’ ENDING ‘2026-03-31’,
PARTITION P202604 STARTING ‘2026-04-01’ ENDING ‘2026-04-30’
);
2.2 自动添加分区
CREATE OR REPLACE PROCEDURE SP_ADD_PARTITION(
IN p_partition_name VARCHAR(20),
IN p_start_date DATE,
IN p_end_date DATE
)
LANGUAGE SQL
BEGIN
DECLARE v_sql VARCHAR(1000);
IN p_partition_name VARCHAR(20),
IN p_start_date DATE,
IN p_end_date DATE
)
LANGUAGE SQL
BEGIN
DECLARE v_sql VARCHAR(1000);
SET v_sql = ‘ALTER TABLE TRANSACTION_LOG ADD PARTITION ‘ ||
p_partition_name || ‘ STARTING ”’ ||
TO_CHAR(p_start_date, ‘YYYY-MM-DD’) || ”’ ENDING ”’ ||
TO_CHAR(p_end_date, ‘YYYY-MM-DD’) || ””;
EXECUTE IMMEDIATE v_sql;
END;
Part03-索引设计
3.1 主键索引
CREATE UNIQUE INDEX IDX_TRANS_PK ON TRANSACTION_LOG(TRANS_ID, TRANS_TIME);
3.2 业务索引
CREATE INDEX IDX_TRANS_ACCOUNT ON TRANSACTION_LOG(ACCOUNT_ID, TRANS_TIME DESC);
CREATE INDEX IDX_TRANS_TYPE ON TRANSACTION_LOG(TRANS_TYPE, TRANS_TIME DESC);
CREATE INDEX IDX_TRANS_STATUS ON TRANSACTION_LOG(TRANS_STATUS, TRANS_TIME DESC);
CREATE INDEX IDX_TRANS_TYPE ON TRANSACTION_LOG(TRANS_TYPE, TRANS_TIME DESC);
CREATE INDEX IDX_TRANS_STATUS ON TRANSACTION_LOG(TRANS_STATUS, TRANS_TIME DESC);
Part04-查询优化
4.1 分区裁剪
SELECT * FROM TRANSACTION_LOG
WHERE TRANS_TIME BETWEEN ‘2026-04-01’ AND ‘2026-04-30’
AND ACCOUNT_ID = ‘A001’;
WHERE TRANS_TIME BETWEEN ‘2026-04-01’ AND ‘2026-04-30’
AND ACCOUNT_ID = ‘A001’;
4.2 统计查询
SELECT
DATE(TRANS_TIME) AS TRANS_DATE,
TRANS_TYPE,
COUNT(*) AS TRANS_COUNT,
SUM(TRANS_AMOUNT) AS TOTAL_AMOUNT
FROM TRANSACTION_LOG
WHERE TRANS_TIME BETWEEN ‘2026-04-01’ AND ‘2026-04-30’
GROUP BY DATE(TRANS_TIME), TRANS_TYPE
ORDER BY TRANS_DATE, TRANS_TYPE;
DATE(TRANS_TIME) AS TRANS_DATE,
TRANS_TYPE,
COUNT(*) AS TRANS_COUNT,
SUM(TRANS_AMOUNT) AS TOTAL_AMOUNT
FROM TRANSACTION_LOG
WHERE TRANS_TIME BETWEEN ‘2026-04-01’ AND ‘2026-04-30’
GROUP BY DATE(TRANS_TIME), TRANS_TYPE
ORDER BY TRANS_DATE, TRANS_TYPE;
Part05-风哥经验总结与分享
5.1 交易流水存储要点
- 使用分区表管理大数据量
- 合理设计索引提高查询性能
- 定期归档历史数据
- 建立数据清理机制
- 优化查询语句
- 定期维护统计信息
5.2 存储建议
| 数据量 | 分区策略 | 保留期限 |
|---|---|---|
| <100万/日 | 月分区 | 1年 |
| 100-1000万/日 | 日分区 | 6个月 |
| >1000万/日 | 小时分区 | 3个月 |
5.3 运维要点
- 定期添加新分区
- 定期归档旧分区
- 定期更新统计信息
- 监控查询性能
- 定期清理索引碎片
- 建立容量规划
更多视频教程www.fgedu.net.cn
学习交流加群风哥微信: itpux-com
风哥Oracle/MySQL/PostgreSQL/Greenplum/DB2/Redis等数据库培训课程,10年一线实战经验,企业级培训,真正掌握数据库核心技术!
学习交流加群风哥微信: itpux-com
风哥Oracle/MySQL/PostgreSQL/Greenplum/DB2/Redis等数据库培训课程,10年一线实战经验,企业级培训,真正掌握数据库核心技术!
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
