yashandb教程FG165-YashanDB并行DML配置
本文档风哥主要介绍YashanDB并行DML的相关知识,包括YashanDB并行DML的概念、优势、使用场景、规划策略、配置方法、参数调优、监控管理等内容,风哥教程参考YashanDB官方文档并行处理相关内容编写,适合DBA人员在学习和生产环境中使用。更多视频教程www.fgedu.net.cn
Part01-基础概念与理论知识
1.1 YashanDB并行DML概念
YashanDB并行DML(Parallel DML)是一种利用多个进程或线程同时执行数据操纵语言(DML)操作的技术。并行DML可以显著提高大批量数据操作的性能,特别是在处理大型表时。并行DML支持INSERT、UPDATE、DELETE和MERGE语句。
- 利用多个进程或线程同时执行DML操作
- 支持INSERT、UPDATE、DELETE和MERGE语句
- 可以显著提高大批量数据操作的性能
- 需要适当的系统资源和配置
- 适合处理大型表和大批量数据操作
1.2 YashanDB并行DML优势
YashanDB并行DML的主要优势包括:
- 性能提升:显著提高大批量数据操作的执行速度
- 资源利用率:充分利用系统的CPU和I/O资源
- 可扩展性:随着系统资源的增加而线性提高性能
- 灵活性:可以根据操作类型和数据量调整并行度
- 简化代码:不需要手动编写并行处理代码
1.3 YashanDB并行DML使用场景
YashanDB并行DML适合以下场景:
- 大批量数据加载:如数据仓库ETL过程中的大批量数据插入
- 大批量数据更新:如批量更新历史数据或批量处理业务数据
- 大批量数据删除:如清理过期数据或批量删除不符合条件的数据
- 数据转换:如数据格式转换或数据迁移
- 数据合并:如使用MERGE语句进行数据同步
Part02-生产环境规划与建议
2.1 YashanDB并行DML规划
YashanDB并行DML规划要点:
– CPU核心数:并行DML需要足够的CPU资源
– 内存容量:并行操作需要更多的内存
– I/O性能:并行操作会增加I/O负载
– 存储系统:需要高性能的存储系统
# 并行度规划
– 根据CPU核心数确定最大并行度
– 根据操作类型调整并行度
– 根据数据量大小调整并行度
– 考虑系统其他负载
# 操作类型评估
– INSERT操作:适合高并行度
– UPDATE操作:需要考虑行级锁竞争
– DELETE操作:需要考虑行级锁竞争
– MERGE操作:需要考虑复杂性
# 表特性评估
– 表大小:大型表更适合并行操作
– 索引情况:索引会影响并行性能
– 分区情况:分区表更适合并行操作
– 数据分布:均匀分布的数据更适合并行操作
2.2 YashanDB并行DML策略
YashanDB并行DML策略建议:
– 小批量操作:低并行度(1-4)
– 中批量操作:中等并行度(4-8)
– 大批量操作:高并行度(8-16)
– 超大批量操作:超高并行度(16+)
# 操作类型策略
– INSERT:较高并行度,适合多进程同时插入
– UPDATE:中等并行度,避免锁竞争
– DELETE:中等并行度,避免锁竞争
– MERGE:根据复杂性调整并行度
# 时间策略
– 低峰期:使用高并行度
– 高峰期:使用低并行度或避免并行操作
– 批量窗口:在专门的批量处理窗口使用高并行度
# 资源限制策略
– 设置并行操作的资源限制
– 监控并行操作的资源使用
– 避免并行操作影响在线业务
2.3 YashanDB并行DML性能考虑
YashanDB并行DML性能考虑:
- 并行度与性能:适当的并行度可以提高性能,但过高的并行度会导致资源竞争
- 锁竞争:并行DML可能会增加锁竞争,特别是UPDATE和DELETE操作
- I/O瓶颈:并行操作会增加I/O负载,可能成为性能瓶颈
- 内存使用:并行操作需要更多的内存,可能导致内存不足
- 网络带宽:在分布式环境中,网络带宽可能成为瓶颈
Part03-生产环境项目实施方案
3.1 YashanDB并行DML配置
3.1.1 YashanDB并行DML启用
ALTER SESSION ENABLE PARALLEL DML;
— 检查并行DML状态
SELECT * FROM v$session WHERE sid = SYS_CONTEXT(‘USERENV’, ‘SID’);
— 输出结果(示例)
SID SERIAL# USERNAME STATUS PARALLEL DML_ENABLED
———- ———- ———- ———- ——– ———–
123 456 FGEDU ACTIVE YES ENABLED
— 为特定表启用并行DML
ALTER TABLE fgedu_sales PARALLEL 8;
— 检查表并行度设置
SELECT table_name, degree FROM user_tables WHERE table_name = ‘FGEDU_SALES’;
— 输出结果
TABLE_NAME DEGREE
———— ———-
FGEDU_SALES 8
3.1.2 YashanDB并行DML参数配置
SHOW PARAMETER parallel;
— 输出结果(示例)
NAME TYPE VALUE
———————————— ———– ——————————
parallel_servers_target integer 16
parallel_max_servers integer 32
parallel_min_servers integer 0
parallel_degree_policy string MANUAL
parallel_force_local boolean FALSE
parallel_execution_message_size integer 16384
— 修改并行参数
ALTER SYSTEM SET parallel_servers_target = 32 SCOPE=BOTH;
ALTER SYSTEM SET parallel_max_servers = 64 SCOPE=BOTH;
— 为会话设置并行度
ALTER SESSION SET parallel_degree_policy = ‘AUTO’;
ALTER SESSION SET parallel_servers_target = 32;
3.2 YashanDB并行DML参数调优
3.2.1 YashanDB并行DML关键参数
## 1. parallel_degree_policy
– 说明:控制并行度策略
– 取值:MANUAL(手动)、LIMITED(有限自动)、AUTO(自动)
– 建议:生产环境使用AUTO或LIMITED
## 2. parallel_servers_target
– 说明:并行服务器目标数量
– 取值:根据CPU核心数设置,建议为CPU核心数的1-2倍
– 建议:8核CPU设置为16,16核CPU设置为32
## 3. parallel_max_servers
– 说明:最大并行服务器数量
– 取值:parallel_servers_target的2倍
– 建议:根据系统资源设置
## 4. parallel_min_servers
– 说明:最小并行服务器数量
– 取值:0或根据需要设置
– 建议:一般设置为0,按需启动
## 5. parallel_force_local
– 说明:是否强制使用本地并行
– 取值:TRUE/FALSE
– 建议:单实例环境设置为TRUE
## 6. parallel_execution_message_size
– 说明:并行执行消息大小
– 取值:16384(16KB)或32768(32KB)
– 建议:使用默认值16384
3.2.2 YashanDB并行DML参数调优建议
ALTER SYSTEM SET parallel_degree_policy = ‘AUTO’ SCOPE=BOTH;
ALTER SYSTEM SET parallel_servers_target = 32 SCOPE=BOTH;
ALTER SYSTEM SET parallel_max_servers = 64 SCOPE=BOTH;
ALTER SYSTEM SET parallel_min_servers = 4 SCOPE=BOTH;
— 为表设置并行度
ALTER TABLE fgedu_sales PARALLEL 16;
ALTER TABLE fgedu_customers PARALLEL 8;
— 为索引设置并行度
ALTER INDEX idx_fgedu_sales_date PARALLEL 16;
— 检查并行度设置
SELECT
table_name,
degree,
parallel_instance_group,
parallel_queue_timeout
FROM user_tables
WHERE table_name IN (‘FGEDU_SALES’, ‘FGEDU_CUSTOMERS’);
3.3 YashanDB并行DML监控
3.3.1 YashanDB并行DML监控查询
SELECT
sid,
serial#,
username,
sql_id,
degree,
req_degree,
actual_degree,
status
FROM v$px_session
ORDER BY sid;
— 查看并行服务器状态
SELECT
server_name,
status,
sid,
serial#,
username,
sql_id
FROM v$px_process
ORDER BY server_name;
— 查看并行执行统计信息
SELECT
sql_id,
plan_hash_value,
executions,
parallel_executions,
cpu_time,
elapsed_time,
buffer_gets,
disk_reads
FROM v$sql
WHERE sql_text LIKE ‘%INSERT%’ OR sql_text LIKE ‘%UPDATE%’ OR sql_text LIKE ‘%DELETE%’
ORDER BY elapsed_time DESC;
— 查看并行等待事件
SELECT
event,
total_waits,
time_waited,
avg_wait
FROM v$system_event
WHERE event LIKE ‘%parallel%’
ORDER BY time_waited DESC;
Part04-生产案例与实战讲解
4.1 YashanDB并行INSERT实战
案例背景:某企业需要将大量数据从临时表加载到正式表中,使用并行INSERT提高性能。
CREATE TABLE fgedu_sales_temp (
id NUMBER(10),
sale_date DATE,
customer_id NUMBER(10),
amount NUMBER(12,2),
product_id NUMBER(10)
);
— 步骤2:插入测试数据(模拟大批量数据)
INSERT INTO fgedu_sales_temp
SELECT
rownum,
TO_DATE(‘2025-01-01’, ‘YYYY-MM-DD’) + MOD(rownum, 365),
MOD(rownum, 10000) + 1,
DBMS_RANDOM.VALUE(100, 10000),
MOD(rownum, 1000) + 1
FROM dual
CONNECT BY LEVEL <= 1000000;
-- 步骤3:启用并行DML
ALTER SESSION ENABLE PARALLEL DML;
-- 步骤4:设置并行度
ALTER SESSION SET parallel_degree_policy = 'AUTO';
-- 步骤5:执行并行INSERT
INSERT /*+ PARALLEL(16) */ INTO fgedu_sales
SELECT * FROM fgedu_sales_temp;
-- 输出结果
1000000 rows created.
-- 步骤6:查看执行计划
EXPLAIN PLAN FOR
INSERT /*+ PARALLEL(16) */ INTO fgedu_sales
SELECT * FROM fgedu_sales_temp;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
-- 输出结果(示例)
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 1234567890
-------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib |
-------------------------------------------------------------------------------
| 0 | INSERT STATEMENT | | 1000K| 28M| 1000 (1)| 00:00:12 | | | |
| 1 | PX COORDINATOR | | | | | | | | |
| 2 | PX SEND QC (RANDOM) | :TQ10000 | 1000K| 28M| 1000 (1)| 00:00:12 | Q1,00 | P->S | QC (RAND) |
| 3 | LOAD TABLE CONVENTIONAL | FGEDU_SALES | | | | | Q1,00 | PCWP | |
| 4 | PX RECEIVE | | 1000K| 28M| 1000 (1)| 00:00:12 | Q1,00 | PCWP | |
| 5 | PX SEND RANDOM | :TQ10001 | 1000K| 28M| 1000 (1)| 00:00:12 | Q1,01 | P->P | RANDOM |
| 6 | PX BLOCK ITERATOR| | 1000K| 28M| 1000 (1)| 00:00:12 | Q1,01 | PCWC | |
| 7 | TABLE ACCESS FULL| FGEDU_SALES_TEMP| 1000K| 28M| 1000 (1)| 00:00:12 | Q1,01 | PCWP | |
——————————————————————————-
4.2 YashanDB并行UPDATE实战
案例背景:某企业需要更新大量销售数据的状态,使用并行UPDATE提高性能。
ALTER SESSION ENABLE PARALLEL DML;
— 步骤2:设置并行度
ALTER SESSION SET parallel_degree_policy = ‘AUTO’;
— 步骤3:执行并行UPDATE
UPDATE /*+ PARALLEL(8) */ fgedu_sales
SET amount = amount * 1.1
WHERE sale_date BETWEEN TO_DATE(‘2025-01-01’, ‘YYYY-MM-DD’) AND TO_DATE(‘2025-01-31’, ‘YYYY-MM-DD’);
— 输出结果
100000 rows updated.
— 步骤4:查看执行计划
EXPLAIN PLAN FOR
UPDATE /*+ PARALLEL(8) */ fgedu_sales
SET amount = amount * 1.1
WHERE sale_date BETWEEN TO_DATE(‘2025-01-01’, ‘YYYY-MM-DD’) AND TO_DATE(‘2025-01-31’, ‘YYYY-MM-DD’);
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
— 输出结果(示例)
PLAN_TABLE_OUTPUT
——————————————————————————–
Plan hash value: 9876543210
——————————————————————————-
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib |
——————————————————————————-
| 0 | UPDATE STATEMENT | | 100000| 2800K| 500 (2)| 00:00:06 | | | |
| 1 | PX COORDINATOR | | | | | | | | |
| 2 | PX SEND QC (RANDOM) | :TQ10000 | 100000| 2800K| 500 (2)| 00:00:06 | Q1,00 | P->S | QC (RAND) |
| 3 | UPDATE | FGEDU_SALES | | | | | Q1,00 | PCWP | |
| 4 | PX RECEIVE | | 100000| 2800K| 500 (2)| 00:00:06 | Q1,00 | PCWP | |
| 5 | PX SEND RANDOM | :TQ10001 | 100000| 2800K| 500 (2)| 00:00:06 | Q1,01 | P->P | RANDOM |
| 6 | PX BLOCK ITERATOR| | 100000| 2800K| 500 (2)| 00:00:06 | Q1,01 | PCWC | |
| 7 | TABLE ACCESS FULL| FGEDU_SALES | 100000| 2800K| 500 (2)| 00:00:06 | Q1,01 | PCWP | |
——————————————————————————-
4.3 YashanDB并行DELETE实战
案例背景:某企业需要删除大量过期的销售数据,使用并行DELETE提高性能。
ALTER SESSION ENABLE PARALLEL DML;
— 步骤2:设置并行度
ALTER SESSION SET parallel_degree_policy = ‘AUTO’;
— 步骤3:执行并行DELETE
DELETE /*+ PARALLEL(8) */ FROM fgedu_sales
WHERE sale_date < TO_DATE('2024-01-01', 'YYYY-MM-DD');
-- 输出结果
500000 rows deleted.
-- 步骤4:查看执行计划
EXPLAIN PLAN FOR
DELETE /*+ PARALLEL(8) */ FROM fgedu_sales
WHERE sale_date < TO_DATE('2024-01-01', 'YYYY-MM-DD');
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
-- 输出结果(示例)
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 5678901234
-------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib |
-------------------------------------------------------------------------------
| 0 | DELETE STATEMENT | | 500000| 1400K| 250 (2)| 00:00:03 | | | |
| 1 | PX COORDINATOR | | | | | | | | |
| 2 | PX SEND QC (RANDOM) | :TQ10000 | 500000| 1400K| 250 (2)| 00:00:03 | Q1,00 | P->S | QC (RAND) |
| 3 | DELETE | FGEDU_SALES | | | | | Q1,00 | PCWP | |
| 4 | PX RECEIVE | | 500000| 1400K| 250 (2)| 00:00:03 | Q1,00 | PCWP | |
| 5 | PX SEND RANDOM | :TQ10001 | 500000| 1400K| 250 (2)| 00:00:03 | Q1,01 | P->P | RANDOM |
| 6 | PX BLOCK ITERATOR| | 500000| 1400K| 250 (2)| 00:00:03 | Q1,01 | PCWC | |
| 7 | TABLE ACCESS FULL| FGEDU_SALES | 500000| 1400K| 250 (2)| 00:00:03 | Q1,01 | PCWP | |
——————————————————————————-
— 步骤5:提交事务
COMMIT;
Part05-风哥经验总结与分享
5.1 YashanDB并行DML最佳实践
YashanDB并行DML最佳实践:
- 合理选择并行度:根据系统资源和操作类型选择合适的并行度
- 优化表结构:使用分区表和适当的索引提高并行性能
- 监控资源使用:定期监控并行操作的资源使用情况
- 避免锁竞争:对于UPDATE和DELETE操作,注意避免锁竞争
- 合理安排时间:在系统低峰期执行大批量并行操作
- 使用并行提示:在SQL语句中使用并行提示控制并行度
- 定期收集统计信息:确保优化器能够生成正确的并行执行计划
- 测试验证:在生产环境部署前进行充分的测试验证
5.2 YashanDB并行DML检查清单
– [ ] 系统资源是否充足(CPU、内存、I/O)
– [ ] 并行度设置是否合理
– [ ] 并行参数是否正确配置
– [ ] 表结构是否适合并行操作(分区表、索引)
– [ ] 统计信息是否最新
– [ ] 是否在低峰期执行
– [ ] 是否监控资源使用情况
– [ ] 是否设置了适当的事务隔离级别
– [ ] 是否有足够的回滚空间
– [ ] 是否测试了并行性能
# 并行DML配置步骤
1. 评估系统资源和操作需求
2. 配置并行相关参数
3. 启用并行DML
4. 设置表和索引的并行度
5. 执行并行DML操作
6. 监控执行情况
7. 调整并行度和参数
8. 总结和优化
# 并行DML性能评估指标
– 执行时间:与串行执行相比的性能提升
– 资源利用率:CPU、内存、I/O的使用情况
– 锁竞争:是否存在锁等待和死锁
– 系统影响:对其他业务的影响程度
– 可扩展性:随着数据量增加的性能表现
5.3 YashanDB并行DML常见问题处理
YashanDB并行DML常见问题及处理方法:
– 现象:系统资源耗尽,性能下降
– 处理:降低并行度,根据系统资源调整
# 常见问题2:锁竞争严重
– 现象:并行UPDATE或DELETE操作出现大量锁等待
– 处理:降低并行度,优化WHERE条件,使用分区表
# 常见问题3:I/O瓶颈
– 现象:并行操作导致I/O性能下降
– 处理:优化存储系统,使用SSD,调整I/O调度
# 常见问题4:内存不足
– 现象:并行操作导致内存不足错误
– 处理:增加内存,降低并行度,调整PGA设置
# 常见问题5:并行执行计划不正确
– 现象:优化器未选择并行执行计划
– 处理:收集统计信息,使用并行提示,检查参数设置
# 常见问题6:并行服务器启动失败
– 现象:无法启动足够的并行服务器
– 处理:检查系统资源,调整parallel_max_servers参数
# 常见问题7:性能提升不明显
– 现象:并行执行与串行执行性能差异不大
– 处理:检查并行度设置,优化SQL语句,检查系统瓶颈
# 常见问题8:事务回滚缓慢
– 现象:并行DML失败后回滚时间长
– 处理:使用较小的事务批次,确保足够的回滚空间
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
