风哥教程参考DB2官方文档Architecture、Best Practices等内容,详细介绍架构评审、设计原则、优化建议等。更多视频教程www.fgedu.net.cn
目录大纲
Part01-架构评审概述
1.1 架构评审重要性
架构评审重要性:
- 发现设计缺陷
- 优化性能瓶颈
- 提高系统可靠性
- 降低运维成本
1.2 评审范围
- 数据库设计:表结构、索引、约束
- 性能设计:SQL优化、缓存策略
- 高可用设计:备份、容灾、HA
- 安全设计:权限、加密、审计
Part02-评审要点
2.1 表设计评审
# 1. 主键设计
SELECT
TABNAME,
COLNAMES
FROM SYSCAT.INDEXES
WHERE UNIQUERULE = ‘P’
AND TABSCHEMA = ‘FGEDB’;
# 2. 外键设计
SELECT
CONSTNAME,
TABNAME,
REFTABNAME,
COLCOUNT
FROM SYSCAT.REFERENCES
WHERE TABSCHEMA = ‘FGEDB’;
# 3. 索引设计
SELECT
INDNAME,
TABNAME,
COLNAMES,
UNIQUERULE,
CARD,
CLUSTERRATIO
FROM SYSCAT.INDEXES
WHERE TABSCHEMA = ‘FGEDB’
ORDER BY TABNAME;
# 4. 分区设计
SELECT
TABNAME,
DATAPARTITIONNAME,
LOWVALUE,
HIGHVALUE
FROM SYSCAT.DATAPARTITIONS
WHERE TABSCHEMA = ‘FGEDB’;
# 5. 表空间设计
SELECT
TBSP_NAME,
TBSP_TYPE,
TBSP_PAGE_SIZE,
TBSP_TOTAL_PAGES,
TBSP_USED_PAGES
FROM SYSIBMADM.TBSP_UTILIZATION;
2.2 性能评审
# 1. 慢查询分析
SELECT
SUBSTR(STMT_TEXT, 1, 100) AS STMT_TEXT,
TOTAL_EXEC_TIME,
TOTAL_USR_CPU_TIME,
TOTAL_SYS_CPU_TIME,
NUM_EXECUTIONS
FROM SYSIBMADM.TOP_DYNAMIC_SQL
ORDER BY TOTAL_EXEC_TIME DESC
FETCH FIRST 20 ROWS ONLY;
# 2. 缓冲池命中率
SELECT
BPNAME,
DATA_HIT_RATIO_PERCENT,
INDEX_HIT_RATIO_PERCENT
FROM SYSIBMADM.BP_HITRATIO;
# 3. 排序溢出
SELECT
TOTAL_SORTS,
TOTAL_SORT_OVERFLOWS,
ROUND(TOTAL_SORT_OVERFLOWS * 100.0 / NULLIF(TOTAL_SORTS, 0), 2) AS OVERFLOW_PERCENT
FROM SYSIBMADM.SNAPDB;
# 4. 锁等待
SELECT
LOCK_NAME,
LOCK_OBJECT_TYPE,
LOCK_MODE,
LOCK_WAIT_MODE,
AGENT_ID_HOLDING_LK
FROM SYSIBMADM.LOCKWAITS;
# 5. 表空间使用
SELECT
TBSP_NAME,
ROUND(TBSP_USED_PAGES * 100.0 / TBSP_TOTAL_PAGES, 2) AS USAGE_PERCENT
FROM SYSIBMADM.TBSP_UTILIZATION
WHERE TBSP_USED_PAGES * 100.0 / TBSP_TOTAL_PAGES > 80;
Part03-评审方法
3.1 自动化评审脚本
# db2_architecture_review.sh
DBNAME=FGEDB
OUTPUT_DIR=/db2/review
DATE=$(date +%Y%m%d)
mkdir -p $OUTPUT_DIR/$DATE
# 1. 表设计评审
db2 connect to $DBNAME
db2 “export to $OUTPUT_DIR/$DATE/table_design.del of del
select tabname, card, npages, fpages from syscat.tables
where tabschema=’FGEDB'”
# 2. 索引设计评审
db2 “export to $OUTPUT_DIR/$DATE/index_design.del of del
select indname, tabname, colnames, uniquerule, card
from syscat.indexes where tabschema=’FGEDB'”
# 3. 性能评审
db2 “export to $OUTPUT_DIR/$DATE/slow_queries.del of del
select substr(stmt_text,1,100), total_exec_time
from sysibmadm.top_dynamic_sql
order by total_exec_time desc fetch first 20 rows only”
# 4. 缓冲池评审
db2 “export to $OUTPUT_DIR/$DATE/bufferpool.del of del
select bpname, data_hit_ratio_percent, index_hit_ratio_percent
from sysibmadm.bp_hitratio”
# 5. 表空间评审
db2 “export to $OUTPUT_DIR/$DATE/tablespace.del of del
select tbsp_name, round(tbsp_used_pages*100.0/tbsp_total_pages,2)
from sysibmadm.tbsp_utilization”
db2 connect reset
# 生成评审报告 ## 1. 基本信息 ## 2. 表设计评审 ### 2.2 主键设计 ### 2.3 索引设计 ### 2.4 问题发现 ## 3. 性能评审 ### 3.2 缓冲池 ### 3.3 排序溢出 ## 4. 高可用评审 ### 4.2 HADR配置 ## 5. 安全评审 ### 5.2 审计配置 ## 6. 优化建议 ## 7. 风险评估 # 2. 添加外键 # 3. 创建索引 # 4. 创建分区表 # 5. 创建MDC表 # 2. 增大排序堆 # 3. 优化SQL # 使用索引提示 # 4. 创建MQT REFRESH TABLE MQT_ORDER_SUMMARY; # 5. 更新统计信息
cat > $OUTPUT_DIR/$DATE/review_report.txt <3.2 评审报告模板
– 数据库名称:FGEDB
– 数据库版本:DB2 11.5
– 评审日期:2026-04-08
– 评审人员:风哥
### 2.1 表数量统计
– 总表数:100
– 分区表数:10
– MDC表数:5
– 有主键表:95
– 无主键表:5
– 总索引数:200
– 唯一索引:50
– 复合索引:100
– 无主键表:5个
– 缺少索引:10个
– 冗余索引:3个
### 3.1 慢查询
– 慢查询数量:20
– 平均执行时间:5秒
– 缓冲池命中率:95%
– 建议增大缓冲池
– 排序溢出率:3%
– 建议增大SORTHEAP
### 4.1 备份策略
– 全量备份:每日
– 增量备份:每小时
– 备份保留:7天
– 主库:192.168.1.10
– 备库:192.168.1.11
– 同步模式:SYNC
### 5.1 权限管理
– 用户数量:50
– 角色数量:10
– 过度授权:5个
– 审计状态:已启用
– 审计范围:ALL
– 审计日志保留:1年
1. 为无主键表添加主键
2. 为缺少索引的表创建索引
3. 删除冗余索引
4. 增大缓冲池大小
5. 增大SORTHEAP参数
6. 回收过度授权的权限
– 高风险:无主键表可能导致数据重复
– 中风险:缺少索引影响查询性能
– 低风险:缓冲池命中率略低
Part04-优化建议
4.1 表设计优化
ALTER TABLE ORDERS ADD CONSTRAINT PK_ORDERS PRIMARY KEY (ORDER_ID);
ALTER TABLE ORDER_ITEMS
ADD CONSTRAINT FK_ORDER_ITEMS_ORDER
FOREIGN KEY (ORDER_ID) REFERENCES ORDERS(ORDER_ID);
CREATE INDEX IDX_ORDERS_CUSTOMER ON ORDERS(CUSTOMER_ID, CREATE_TIME DESC);
CREATE TABLE ORDERS_PARTITIONED (
ORDER_ID VARCHAR(32) NOT NULL,
CUSTOMER_ID VARCHAR(32),
CREATE_TIME TIMESTAMP NOT NULL,
CONSTRAINT PK_ORDERS_PARTITIONED PRIMARY KEY (ORDER_ID, CREATE_TIME)
) PARTITION BY RANGE (CREATE_TIME)
(
PARTITION P202601 STARTING ‘2026-01-01’ ENDING ‘2026-01-31’,
PARTITION P202602 STARTING ‘2026-02-01’ ENDING ‘2026-02-28’
);
CREATE TABLE SALES_MDC (
SALE_ID BIGINT NOT NULL,
SALE_DATE DATE NOT NULL,
REGION VARCHAR(50) NOT NULL,
CONSTRAINT PK_SALES_MDC PRIMARY KEY (SALE_ID)
) ORGANIZE BY (SALE_DATE, REGION);
4.2 性能优化
ALTER BUFFERPOOL BP_DEFAULT SIZE 200000;
UPDATE DATABASE CONFIGURATION USING SORTHEAP 16384 IMMEDIATE;
# 添加索引避免全表扫描
CREATE INDEX IDX_ORDERS_STATUS ON ORDERS(ORDER_STATUS, CREATE_TIME);
SELECT * FROM ORDERS
WHERE ORDER_STATUS = ‘PENDING’
OPTIMIZE FOR 100 ROWS;
CREATE TABLE MQT_ORDER_SUMMARY AS (
SELECT
DATE(CREATE_TIME) AS ORDER_DATE,
COUNT(*) AS ORDER_COUNT,
SUM(TOTAL_AMOUNT) AS TOTAL_AMOUNT
FROM ORDERS
GROUP BY DATE(CREATE_TIME)
) DATA INITIALLY DEFERRED REFRESH DEFERRED;
RUNSTATS ON TABLE ORDERS WITH DISTRIBUTION AND INDEXES ALL;
Part05-风哥经验总结与分享
5.1 架构评审要点
5.2 评审建议
评审项
评审频率
重点关注
表设计
每季度
主键、索引、分区
性能
每月
慢查询、缓冲池
高可用
每半年
备份、HADR
5.3 运维要点
学习交流加群风哥微信: itpux-com
风哥Oracle/MySQL/PostgreSQL/Greenplum/DB2/Redis等数据库培训课程,10年一线实战经验,企业级培训,真正掌握数据库核心技术!
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
