yashandb教程FG162-YashanDB列表分区实战
本文档风哥主要介绍YashanDB列表分区的相关知识,包括YashanDB列表分区的概念、优势、使用场景、规划策略、创建方法、管理维护、监控优化等内容,风哥教程参考YashanDB官方文档分区表相关内容编写,适合DBA人员在学习和生产环境中使用。更多视频教程www.fgedu.net.cn
Part01-基础概念与理论知识
1.1 YashanDB列表分区概念
YashanDB列表分区(List Partition)是一种基于离散值列表将表数据划分为多个分区的分区方法。每个分区包含具有特定值的行,这些值由分区键的具体值决定。列表分区适合于分区键值是离散的、有限的情况,如地区、状态、类型等。
- 基于离散值列表进行分区
- 每个分区对应一组特定的值
- 分区键通常是枚举类型、地区代码、状态码等离散值
- 支持默认分区(DEFAULT)处理未明确指定的值
- 可以实现数据的按类别管理和查询
1.2 YashanDB列表分区优势
YashanDB列表分区的主要优势包括:
- 数据分类管理:可以按业务类别对数据进行分类管理
- 查询性能提升:针对特定类别的查询可以只访问相关分区
- 维护灵活性:可以单独管理每个类别的数据
- 数据隔离:不同类别的数据可以存储在不同的表空间
- 负载均衡:可以将不同类别的数据分布到不同的存储设备
1.3 YashanDB列表分区使用场景
YashanDB列表分区适合以下场景:
- 按地区分区:如按省份、城市、国家等地理区域分区
- 按状态分区:如按订单状态、用户状态等业务状态分区
- 按类型分区:如按产品类型、服务类型等分类分区
- 按部门分区:如按公司部门、组织单位等分区
- 按渠道分区:如按销售渠道、营销渠道等分区
Part02-生产环境规划与建议
2.1 YashanDB列表分区规划
YashanDB列表分区规划要点:
– 选择具有离散值的列
– 选择业务上有明确分类的列
– 选择查询中经常使用的过滤条件列
– 避免选择值过多的列(建议不超过100个值)
# 分区值设计
– 考虑业务分类的完整性
– 考虑未来可能的扩展
– 合理设置默认分区处理未知值
– 避免分区数量过多
# 存储规划
– 不同分区可以存储在不同表空间
– 重要类别的数据可以存储在高性能存储
– 历史数据可以存储在低成本存储
# 分区命名规范
– 采用有意义的命名方式
– 包含分区值信息
– 便于管理和识别
2.2 YashanDB列表分区策略
YashanDB列表分区策略建议:
– 按业务重要性分组:将重要类别单独分区
– 按数据量分组:将数据量大的类别单独分区
– 按访问频率分组:将高频访问的类别单独分区
– 按管理需求分组:将需要单独管理的类别分区
# 分区数量控制
– 一般建议分区数量在50个以内
– 避免过多分区导致管理复杂
– 避免过少分区导致性能提升不明显
# 默认分区策略
– 为未明确指定的值设置默认分区
– 定期检查默认分区的数据量
– 及时将默认分区中的数据迁移到合适的分区
# 分区维护策略
– 定期监控分区大小
– 制定分区合并和拆分计划
– 建立分区清理机制
2.3 YashanDB列表分区性能考虑
YashanDB列表分区性能考虑:
- 查询性能:针对特定类别的查询可以显著提高性能
- 插入性能:分区表的插入性能与非分区表相当
- 维护性能:可以针对单个分区进行维护操作
- 空间使用:可以更灵活地管理存储空间
Part03-生产环境项目实施方案
3.1 YashanDB列表分区表创建
3.1.1 YashanDB列表分区表创建语法
CREATE TABLE fgedu_customers (
customer_id NUMBER(10) PRIMARY KEY,
name VARCHAR2(100),
province VARCHAR2(50),
city VARCHAR2(50),
address VARCHAR2(200),
phone VARCHAR2(20)
)
PARTITION BY LIST (province) (
PARTITION p_beijing VALUES (‘北京市’),
PARTITION p_shanghai VALUES (‘上海市’),
PARTITION p_guangdong VALUES (‘广东省’),
PARTITION p_jiangsu VALUES (‘江苏省’),
PARTITION p_zhejiang VALUES (‘浙江省’),
PARTITION p_other VALUES (DEFAULT)
);
— 查看分区表信息
SELECT table_name, partition_name, high_value
FROM user_tab_partitions
WHERE table_name = ‘FGEDU_CUSTOMERS’
ORDER BY partition_name;
— 输出结果
TABLE_NAME PARTITION_NAME HIGH_VALUE
————— ————– ———-
FGEDU_CUSTOMERS P_BEIJING ‘北京市’
FGEDU_CUSTOMERS P_GUANGDONG ‘广东省’
FGEDU_CUSTOMERS P_JIANGSU ‘江苏省’
FGEDU_CUSTOMERS P_OTHER DEFAULT
FGEDU_CUSTOMERS P_SHANGHAI ‘上海市’
FGEDU_CUSTOMERS P_ZHEJIANG ‘浙江省’
3.1.2 YashanDB列表分区表创建示例
CREATE TABLE fgedu_orders (
order_id NUMBER(12) PRIMARY KEY,
customer_id NUMBER(10),
order_date DATE,
total_amount NUMBER(12,2),
status VARCHAR2(20)
)
PARTITION BY LIST (status) (
PARTITION p_pending VALUES (‘PENDING’),
PARTITION p_processing VALUES (‘PROCESSING’),
PARTITION p_completed VALUES (‘COMPLETED’),
PARTITION p_cancelled VALUES (‘CANCELLED’),
PARTITION p_other VALUES (DEFAULT)
);
— 查看分区表信息
SELECT table_name, partition_name, high_value
FROM user_tab_partitions
WHERE table_name = ‘FGEDU_ORDERS’
ORDER BY partition_name;
— 输出结果
TABLE_NAME PARTITION_NAME HIGH_VALUE
———— ————– ———-
FGEDU_ORDERS P_CANCELLED ‘CANCELLED’
FGEDU_ORDERS P_COMPLETED ‘COMPLETED’
FGEDU_ORDERS P_OTHER DEFAULT
FGEDU_ORDERS P_PENDING ‘PENDING’
FGEDU_ORDERS P_PROCESSING ‘PROCESSING’
3.2 YashanDB列表分区管理
3.2.1 YashanDB列表分区添加
ALTER TABLE fgedu_customers ADD PARTITION p_sichuan VALUES (‘四川省’);
— 为客户表添加多个分区
ALTER TABLE fgedu_customers ADD (
PARTITION p_henan VALUES (‘河南省’),
PARTITION p_shandong VALUES (‘山东省’),
PARTITION p_hebei VALUES (‘河北省’)
);
— 查看分区表信息
SELECT table_name, partition_name, high_value
FROM user_tab_partitions
WHERE table_name = ‘FGEDU_CUSTOMERS’
ORDER BY partition_name;
3.2.2 YashanDB列表分区删除
ALTER TABLE fgedu_customers DROP PARTITION p_other;
— 查看分区表信息
SELECT table_name, partition_name, high_value
FROM user_tab_partitions
WHERE table_name = ‘FGEDU_CUSTOMERS’
ORDER BY partition_name;
— 输出结果
TABLE_NAME PARTITION_NAME HIGH_VALUE
————— ————– ———-
FGEDU_CUSTOMERS P_BEIJING ‘北京市’
FGEDU_CUSTOMERS P_GUANGDONG ‘广东省’
FGEDU_CUSTOMERS P_HEBEI ‘河北省’
FGEDU_CUSTOMERS P_HENAN ‘河南省’
FGEDU_CUSTOMERS P_JIANGSU ‘江苏省’
FGEDU_CUSTOMERS P_SHANDONG ‘山东省’
FGEDU_CUSTOMERS P_SHANGHAI ‘上海市’
FGEDU_CUSTOMERS P_SICHUAN ‘四川省’
FGEDU_CUSTOMERS P_ZHEJIANG ‘浙江省’
3.2.3 YashanDB列表分区合并
ALTER TABLE fgedu_customers MERGE PARTITIONS p_beijing, p_shanghai INTO PARTITION p_metropolitan;
— 查看分区表信息
SELECT table_name, partition_name, high_value
FROM user_tab_partitions
WHERE table_name = ‘FGEDU_CUSTOMERS’
ORDER BY partition_name;
— 输出结果
TABLE_NAME PARTITION_NAME HIGH_VALUE
————— ————– ———-
FGEDU_CUSTOMERS P_GUANGDONG ‘广东省’
FGEDU_CUSTOMERS P_HEBEI ‘河北省’
FGEDU_CUSTOMERS P_HENAN ‘河南省’
FGEDU_CUSTOMERS P_JIANGSU ‘江苏省’
FGEDU_CUSTOMERS P_METROPOLITAN ‘北京市’, ‘上海市’
FGEDU_CUSTOMERS P_SHANDONG ‘山东省’
FGEDU_CUSTOMERS P_SICHUAN ‘四川省’
FGEDU_CUSTOMERS P_ZHEJIANG ‘浙江省’
3.3 YashanDB列表分区监控
3.3.1 YashanDB列表分区监控查询
SELECT
table_name,
partition_name,
high_value,
num_rows,
blocks,
empty_blocks
FROM user_tab_partitions
WHERE table_name = ‘FGEDU_CUSTOMERS’
ORDER BY partition_name;
— 查看分区表的空间使用情况
SELECT
table_name,
partition_name,
segment_name,
segment_type,
tablespace_name,
bytes/1024/1024 as size_mb
FROM user_segments
WHERE table_name = ‘FGEDU_CUSTOMERS’
ORDER BY partition_name;
— 查看分区表的索引信息
SELECT
index_name,
partition_name,
status
FROM user_ind_partitions
WHERE index_name IN (
SELECT index_name
FROM user_indexes
WHERE table_name = ‘FGEDU_CUSTOMERS’
)
ORDER BY index_name, partition_name;
Part04-生产案例与实战讲解
4.1 YashanDB列表分区按地区分区实战
案例背景:某电商平台需要按地区管理客户数据,方便区域化运营和分析。
CREATE TABLE fgedu_customers (
customer_id NUMBER(10) PRIMARY KEY,
name VARCHAR2(100),
province VARCHAR2(50),
city VARCHAR2(50),
address VARCHAR2(200),
phone VARCHAR2(20),
register_date DATE
)
PARTITION BY LIST (province) (
PARTITION p_beijing VALUES (‘北京市’),
PARTITION p_shanghai VALUES (‘上海市’),
PARTITION p_guangdong VALUES (‘广东省’),
PARTITION p_jiangsu VALUES (‘江苏省’),
PARTITION p_zhejiang VALUES (‘浙江省’),
PARTITION p_other VALUES (DEFAULT)
);
— 步骤2:插入测试数据
INSERT INTO fgedu_customers VALUES (1, ‘张三’, ‘北京市’, ‘北京市’, ‘朝阳区’, ‘13800138001’, TO_DATE(‘2025-01-01’, ‘YYYY-MM-DD’));
INSERT INTO fgedu_customers VALUES (2, ‘李四’, ‘上海市’, ‘上海市’, ‘浦东新区’, ‘13800138002’, TO_DATE(‘2025-01-02’, ‘YYYY-MM-DD’));
INSERT INTO fgedu_customers VALUES (3, ‘王五’, ‘广东省’, ‘广州市’, ‘天河区’, ‘13800138003’, TO_DATE(‘2025-01-03’, ‘YYYY-MM-DD’));
INSERT INTO fgedu_customers VALUES (4, ‘赵六’, ‘江苏省’, ‘南京市’, ‘玄武区’, ‘13800138004’, TO_DATE(‘2025-01-04’, ‘YYYY-MM-DD’));
INSERT INTO fgedu_customers VALUES (5, ‘钱七’, ‘浙江省’, ‘杭州市’, ‘西湖区’, ‘13800138005’, TO_DATE(‘2025-01-05’, ‘YYYY-MM-DD’));
INSERT INTO fgedu_customers VALUES (6, ‘孙八’, ‘四川省’, ‘成都市’, ‘锦江区’, ‘13800138006’, TO_DATE(‘2025-01-06’, ‘YYYY-MM-DD’));
— 步骤3:查询特定分区的数据
SELECT * FROM fgedu_customers PARTITION (p_guangdong);
— 输出结果
CUSTOMER_ID NAME PROVINCE CITY ADDRESS PHONE REGISTER_DATE
———– —– ——– ——- ——- ———– ————-
3 王五 广东省 广州市 天河区 13800138003 2025-01-03
— 步骤4:按地区查询(分区裁剪)
SELECT * FROM fgedu_customers WHERE province = ‘北京市’;
— 输出结果
CUSTOMER_ID NAME PROVINCE CITY ADDRESS PHONE REGISTER_DATE
———– —– ——– ——- ——- ———– ————-
1 张三 北京市 北京市 朝阳区 13800138001 2025-01-01
— 步骤5:添加新分区
ALTER TABLE fgedu_customers ADD PARTITION p_sichuan VALUES (‘四川省’);
— 步骤6:将默认分区中的数据迁移到新分区
ALTER TABLE fgedu_customers MERGE PARTITIONS p_other INTO PARTITION p_sichuan;
4.2 YashanDB列表分区按状态分区实战
案例背景:某物流系统需要按订单状态管理订单数据,方便状态跟踪和处理。
CREATE TABLE fgedu_orders (
order_id NUMBER(12) PRIMARY KEY,
customer_id NUMBER(10),
order_date DATE,
total_amount NUMBER(12,2),
status VARCHAR2(20),
last_update DATE
)
PARTITION BY LIST (status) (
PARTITION p_pending VALUES (‘PENDING’),
PARTITION p_processing VALUES (‘PROCESSING’),
PARTITION p_shipping VALUES (‘SHIPPING’),
PARTITION p_delivered VALUES (‘DELIVERED’),
PARTITION p_cancelled VALUES (‘CANCELLED’),
PARTITION p_other VALUES (DEFAULT)
);
— 步骤2:插入测试数据
INSERT INTO fgedu_orders VALUES (1, 1001, TO_DATE(‘2025-01-15’, ‘YYYY-MM-DD’), 1000.00, ‘PENDING’, TO_DATE(‘2025-01-15’, ‘YYYY-MM-DD’));
INSERT INTO fgedu_orders VALUES (2, 1002, TO_DATE(‘2025-01-16’, ‘YYYY-MM-DD’), 2000.00, ‘PROCESSING’, TO_DATE(‘2025-01-16’, ‘YYYY-MM-DD’));
INSERT INTO fgedu_orders VALUES (3, 1003, TO_DATE(‘2025-01-17’, ‘YYYY-MM-DD’), 1500.00, ‘SHIPPING’, TO_DATE(‘2025-01-17’, ‘YYYY-MM-DD’));
INSERT INTO fgedu_orders VALUES (4, 1004, TO_DATE(‘2025-01-18’, ‘YYYY-MM-DD’), 3000.00, ‘DELIVERED’, TO_DATE(‘2025-01-18’, ‘YYYY-MM-DD’));
INSERT INTO fgedu_orders VALUES (5, 1005, TO_DATE(‘2025-01-19’, ‘YYYY-MM-DD’), 2500.00, ‘CANCELLED’, TO_DATE(‘2025-01-19’, ‘YYYY-MM-DD’));
— 步骤3:查询特定状态的订单
SELECT * FROM fgedu_orders PARTITION (p_shipping);
— 输出结果
ORDER_ID CUSTOMER_ID ORDER_DATE TOTAL_AMOUNT STATUS LAST_UPDATE
———- ———– ———- ———— ———- ————
3 1003 2025-01-17 1500.00 SHIPPING 2025-01-17
— 步骤4:更新订单状态
UPDATE fgedu_orders SET status = ‘DELIVERED’, last_update = TO_DATE(‘2025-01-20’, ‘YYYY-MM-DD’) WHERE order_id = 3;
— 步骤5:查询更新后的订单
SELECT * FROM fgedu_orders WHERE order_id = 3;
— 输出结果
ORDER_ID CUSTOMER_ID ORDER_DATE TOTAL_AMOUNT STATUS LAST_UPDATE
———- ———– ———- ———— ———- ————
3 1003 2025-01-17 1500.00 DELIVERED 2025-01-20
— 步骤6:查看订单在哪个分区
SELECT table_name, partition_name
FROM user_tab_partitions
WHERE table_name = ‘FGEDU_ORDERS’
AND ‘DELIVERED’ IN (SELECT * FROM TABLE(high_value));
4.3 YashanDB列表分区优化实战
案例背景:优化列表分区表的查询性能和维护效率。
CREATE INDEX idx_fgedu_customers_province ON fgedu_customers(province) LOCAL;
— 步骤2:分析分区表统计信息
EXEC DBMS_STATS.GATHER_TABLE_STATS(‘FGEDU’, ‘FGEDU_CUSTOMERS’, granularity => ‘PARTITION’);
— 步骤3:查询分区表统计信息
SELECT
table_name,
partition_name,
num_rows,
blocks,
avg_row_len
FROM user_tab_partitions
WHERE table_name = ‘FGEDU_CUSTOMERS’
ORDER BY partition_name;
— 步骤4:使用分区提示优化查询
SELECT /*+ PARALLEL(4) */ *
FROM fgedu_customers PARTITION (p_guangdong)
WHERE register_date >= TO_DATE(‘2025-01-01’, ‘YYYY-MM-DD’);
— 步骤5:创建分区维护脚本
— daily_partition_maintenance.sh
#!/bin/bash
# daily_partition_maintenance.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# 检查默认分区数据量 YashanDB列表分区最佳实践: # 分区维护定期任务 YashanDB列表分区常见问题及处理方法: # 常见问题2:分区值遗漏 # 常见问题3:分区数量过多 # 常见问题4:分区修剪不生效 # 常见问题5:数据分布不均 本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
sqlplus -S fgedu/fgedu@fgedudb <Part05-风哥经验总结与分享
5.1 YashanDB列表分区最佳实践
5.2 YashanDB列表分区检查清单
– [ ] 分区键选择是否合理
– [ ] 分区值设计是否符合业务需求
– [ ] 是否设置了默认分区处理未知值
– [ ] 分区数量是否在合理范围内
– [ ] 是否使用了本地索引
– [ ] 统计信息是否定期收集
– [ ] 是否建立了自动化的分区维护机制
– [ ] 是否定期监控分区表状态
– [ ] 分区命名是否规范
– [ ] 存储策略是否优化
1. 每周检查默认分区的数据量
2. 每月检查分区大小和分布
3. 每季度评估分区策略的有效性
4. 每半年重建索引和收集统计信息
5. 每年根据业务变化调整分区策略
5.3 YashanDB列表分区常见问题处理
– 现象:默认分区包含大量数据
– 处理:分析默认分区数据,创建新分区并迁移数据
– 现象:某些值没有对应的分区
– 处理:及时添加新分区或使用默认分区
– 现象:管理复杂,性能下降
– 处理:合并相似分区,调整分区策略
– 现象:查询时未使用分区修剪
– 处理:检查查询条件是否使用了分区键,收集统计信息
– 现象:某些分区数据量过大,某些过小
– 处理:重新设计分区策略,调整分区值
