Skip to content

Oracle 并行度设置规范

并行度基础

什么是并行度

  • 定义:并行度(Parallelism)是指Oracle数据库同时使用多个进程或线程执行单个SQL语句的能力
  • 目的:通过并行执行提高SQL语句的执行速度,特别是处理大型数据集时
  • 适用场景:大型表的全表扫描、索引创建、分区操作、数据加载等
  • 优势:减少大型操作的执行时间,提高系统资源利用率
  • 劣势:增加系统资源消耗,可能影响其他会话的性能

并行执行的基本原理

  • 并行执行服务器:Oracle创建多个并行执行服务器进程来处理任务
  • 查询协调器:负责分解任务、协调并行服务器和汇总结果
  • 数据分区:将大型数据集分成多个小分区,由不同的并行服务器处理
  • 并行度级别:控制参与并行执行的服务器数量
  • 资源管理:通过资源管理器控制并行执行的资源使用

并行度的类型

并行度类型描述适用场景设置方式
语句级并行度为单个SQL语句设置的并行度特定的大型查询或DML操作SQL语句中使用PARALLEL提示
对象级并行度为表、索引等对象设置的并行度频繁进行大型操作的对象ALTER TABLE/INDEX语句
会话级并行度为整个会话设置的默认并行度会话中多个需要并行执行的语句ALTER SESSION语句
系统级并行度整个系统的默认并行度系统范围内的并行执行初始化参数

并行度配置参数

1. 系统级参数

参数名称描述默认值建议值注意事项
PARALLEL_MAX_SERVERS系统中并行执行服务器的最大数量CPU_COUNT * 2CPU_COUNT * 4根据系统CPU和内存资源调整
PARALLEL_SERVERS_TARGET系统中活跃并行执行服务器的目标数量CPU_COUNT * 2CPU_COUNT * 2避免系统过载
PARALLEL_MIN_SERVERS系统中保持的最小并行执行服务器数量00通常保持默认值
PARALLEL_ADAPTIVE_MULTI_USER启用多用户并行度自适应TRUETRUE多用户环境下建议启用
PARALLEL_DEGREE_POLICY并行度策略MANUALAUTO建议设置为AUTO
PARALLEL_DEGREE_LIMIT并行度上限CPU根据系统资源避免过度并行
PARALLEL_FORCE_LOCAL强制使用本地并行执行FALSEFALSERAC环境下的设置
PARALLEL_IO_CAP_ENABLED启用I/O并行度上限FALSETRUE根据存储系统性能

2. 对象级参数

参数名称描述设置方式适用场景
PARALLEL对象的并行度ALTER TABLE <table_name> PARALLEL <degree>大型表的并行操作
DEGREE并行度设置ALTER TABLE <table_name> PARALLEL DEGREE <degree>明确指定并行度
INSTANCES并行执行的实例数量ALTER TABLE <table_name> PARALLEL INSTANCES <instances>RAC环境
PARALLEL DDLDDL操作的并行度ALTER SESSION ENABLE PARALLEL DDL大型DDL操作
PARALLEL DMLDML操作的并行度ALTER SESSION ENABLE PARALLEL DML大型DML操作

3. 会话级参数

参数名称描述设置方式适用场景
PARALLEL_AUTOMATIC_TUNING自动并行度调优ALTER SESSION SET PARALLEL_AUTOMATIC_TUNING = TRUE简化并行度管理
PARALLEL_EXECUTION_MESSAGE_SIZE并行执行消息大小ALTER SESSION SET PARALLEL_EXECUTION_MESSAGE_SIZE = [size]大消息传输
PARALLEL_DEGREE_POLICY会话级并行度策略ALTER SESSION SET PARALLEL_DEGREE_POLICY = <policy>会话特定需求
PARALLEL_MIN_TIME_THRESHOLD并行执行的时间阈值ALTER SESSION SET PARALLEL_MIN_TIME_THRESHOLD = [time]控制哪些语句使用并行

并行度设置最佳实践

1. 系统级并行度设置

确定合适的并行度上限

  • 基于CPU数量:一般建议初始值为CPU_COUNT的2-4倍
  • 基于内存容量:确保有足够的内存支持并行执行
  • 基于存储性能:考虑存储系统的I/O能力
  • 基于工作负载:根据系统的实际工作负载调整
  • 逐步调整:从保守值开始,逐步增加并观察效果

配置示例

sql
-- 设置并行执行服务器的最大数量
ALTER SYSTEM SET PARALLEL_MAX_SERVERS = 64 SCOPE=SPFILE;

-- 设置并行执行服务器的目标数量
ALTER SYSTEM SET PARALLEL_SERVERS_TARGET = 32 SCOPE=SPFILE;

-- 启用多用户并行度自适应
ALTER SYSTEM SET PARALLEL_ADAPTIVE_MULTI_USER = TRUE SCOPE=SPFILE;

-- 设置并行度策略为自动
ALTER SYSTEM SET PARALLEL_DEGREE_POLICY = AUTO SCOPE=SPFILE;

-- 设置并行度上限
ALTER SYSTEM SET PARALLEL_DEGREE_LIMIT = 16 SCOPE=SPFILE;

2. 对象级并行度设置

为大型表设置并行度

  • 分区表:为分区表设置合适的并行度,通常为分区数量的倍数
  • 大型表:根据表的大小和访问模式设置并行度
  • 索引:为大型索引设置适当的并行度
  • 临时表:考虑为临时表设置并行度
  • 定期评估:定期评估和调整对象的并行度设置

配置示例

sql
-- 为表设置并行度
ALTER TABLE large_table PARALLEL 8;

-- 为表设置自动并行度
ALTER TABLE large_table PARALLEL DEGREE AUTO;

-- 为索引设置并行度
ALTER INDEX large_index PARALLEL 4;

-- 重置表的并行度为默认值
ALTER TABLE large_table NOPARALLEL;

3. 语句级并行度设置

使用并行提示

  • 基本语法SELECT /*+ PARALLEL(n) */ * FROM table_name;
  • 指定并行度:根据语句的复杂度和数据量指定合适的并行度
  • 使用自动并行度/*+ PARALLEL(AUTO) */
  • 针对特定表/*+ PARALLEL(table_alias, n) */
  • 并行DML:在DML语句中使用并行提示

示例

sql
-- 为查询设置并行度8
SELECT /*+ PARALLEL(8) */ 
  department_id, COUNT(*), AVG(salary)
FROM employees 
GROUP BY department_id;

-- 为特定表设置并行度
SELECT /*+ PARALLEL(e, 4) PARALLEL(d, 4) */ 
  e.employee_id, e.name, d.department_name
FROM employees e 
JOIN departments d ON e.department_id = d.department_id;

-- 并行插入操作
INSERT /*+ PARALLEL(6) */ INTO large_table
SELECT * FROM source_table;

-- 并行创建索引
CREATE INDEX /*+ PARALLEL(4) */ emp_idx ON employees(employee_id);

4. 并行度调整最佳实践

  • 从小开始:从较低的并行度开始,逐步增加
  • 监控效果:调整后监控系统性能和资源使用
  • 考虑峰值负载:在系统负载较低时进行大型并行操作
  • 使用资源管理器:通过资源管理器控制并行执行的资源使用
  • 定期评估:定期评估并行度设置的效果,根据业务需求调整

并行执行监控与调优

1. 并行执行监控

监控视图

视图名称描述关键列用途
V$PX_PROCESS显示并行执行进程的状态STATUS, SERVER_GROUP监控并行进程状态
V$PX_SESSION显示会话的并行执行信息SID, QC_SESSION_ID, DEGREE查看会话的并行度
V$SQL_MONITOR显示SQL语句的执行情况PX_SERVERS_ALLOCATED, PX_SERVERS_USED监控并行SQL执行
V$SYSTEM_EVENT显示系统级等待事件EVENT, TOTAL_WAITS识别并行执行的瓶颈
V$RSRC_CONSUMER_GROUP显示资源消费者组信息CPU_WAIT_TIME, QUEUE_TIME监控资源使用

监控SQL

sql
-- 查看当前的并行执行进程
SELECT * FROM V$PX_PROCESS;

-- 查看会话的并行执行情况
SELECT s.sid, s.serial#, s.username, px.qc_session_id, px.degree
FROM V$SESSION s
JOIN V$PX_SESSION px ON s.sid = px.sid;

-- 查看正在执行的并行SQL语句
SELECT sql_id, sql_text, px_servers_allocated, px_servers_used
FROM V$SQL_MONITOR
WHERE px_servers_allocated > 0;

-- 查看并行执行相关的等待事件
SELECT event, total_waits, time_waited
FROM V$SYSTEM_EVENT
WHERE event LIKE '%PX%' OR event LIKE '%parallel%'
ORDER BY total_waits DESC;

2. 并行执行调优

识别并行执行瓶颈

  • CPU瓶颈:当并行度设置过高,CPU使用率接近100%
  • I/O瓶颈:当存储系统无法满足并行I/O需求
  • 内存瓶颈:当并行执行导致内存不足
  • 争用瓶颈:当并行进程之间存在资源争用
  • 消息传递瓶颈:当并行进程之间的消息传递效率低下

调优策略

瓶颈类型症状调优措施
CPU瓶颈高CPU使用率,系统响应缓慢降低并行度,增加CPU资源
I/O瓶颈高I/O等待时间,存储性能下降优化存储系统,使用分区,考虑使用SSD
内存瓶颈ORA-04031错误,内存使用率高增加内存,降低并行度,优化PGA设置
争用瓶颈高争用等待时间,锁等待增加调整并行度,优化SQL语句,使用绑定变量
消息传递瓶颈PX消息等待时间高优化并行执行消息大小,检查网络性能(RAC环境)

3. 并行执行的资源管理

使用资源管理器

  • 创建资源计划:定义资源分配策略
  • 设置资源限制:限制并行执行的资源使用
  • 优先级管理:为不同类型的工作负载设置优先级
  • 并行度限制:为不同的消费者组设置不同的并行度限制

配置示例

sql
-- 创建资源消费者组
BEGIN
  DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(
    consumer_group => 'BATCH_GROUP',
    comment => 'Batch jobs with parallel execution');
END;
/

-- 创建资源计划
BEGIN
  DBMS_RESOURCE_MANAGER.CREATE_PLAN(
    plan => 'PRODUCTION_PLAN',
    comment => 'Production resource plan');
END;
/

-- 为消费者组分配资源
BEGIN
  DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
    plan => 'PRODUCTION_PLAN',
    group_or_subplan => 'BATCH_GROUP',
    comment => 'Batch jobs directive',
    cpu_p1 => 30,
    parallel_degree_limit_p1 => 8);
END;
/

-- 启用资源计划
ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = 'PRODUCTION_PLAN';

并行执行常见问题与解决方案

1. 并行度设置过高

症状

  • 系统CPU使用率接近100%
  • 内存使用率高
  • 其他会话性能下降
  • 并行执行操作缓慢

解决方案

  • 降低系统级并行度参数
  • 为大型操作设置合理的并行度
  • 使用资源管理器限制并行资源使用
  • 在系统负载较低时执行大型并行操作

2. 并行执行不生效

症状

  • 预期应该并行执行的操作没有使用并行
  • 执行计划中没有显示并行操作
  • 性能没有明显提升

解决方案

  • 检查并行度策略设置
  • 确保表或索引的并行度设置正确
  • 检查SQL语句是否适合并行执行
  • 验证系统是否有足够的资源支持并行执行
  • 检查是否有并行执行的限制

3. 并行执行导致系统不稳定

症状

  • 系统出现ORA-04031错误
  • 数据库实例崩溃
  • 系统响应时间变长
  • 其他应用出现性能问题

解决方案

  • 降低PARALLEL_MAX_SERVERS参数
  • 增加系统内存
  • 优化PGA和SGA设置
  • 使用资源管理器限制并行资源使用
  • 对并行操作进行更严格的管理

4. RAC环境中的并行执行问题

症状

  • 并行执行在RAC环境中性能不佳
  • 节点间通信开销大
  • 负载不均衡
  • 资源使用效率低

解决方案

  • 调整PARALLEL_FORCE_LOCAL参数
  • 优化RAC集群的网络配置
  • 使用服务质量(QoS)管理网络资源
  • 考虑使用实例级并行度限制
  • 监控和平衡节点间的负载

并行度设置的特殊场景

1. 数据仓库环境

特点

  • 大型查询和批量操作频繁
  • 系统资源相对充足
  • 对查询性能要求高
  • 并发用户数相对较少

并行度设置建议

  • 较高的系统级并行度设置
  • 为大型表设置较高的对象级并行度
  • 使用自动并行度策略
  • 配置足够的并行执行服务器
  • 利用资源管理器管理高峰期的资源使用

2. 在线事务处理(OLTP)环境

特点

  • 大量短事务
  • 并发用户数多
  • 对响应时间要求高
  • 系统资源需要兼顾多个用户

并行度设置建议

  • 较低的系统级并行度设置
  • 大多数表使用NOPARALLEL
  • 仅对特定的大型操作使用并行
  • 严格限制并行执行的资源使用
  • 在非高峰期执行大型并行操作

3. 混合工作负载环境

特点

  • 同时包含OLTP和数据仓库工作负载
  • 资源竞争复杂
  • 需要平衡不同类型工作的需求
  • 工作负载模式可能随时间变化

并行度设置建议

  • 使用资源管理器划分资源
  • 为不同类型的工作负载创建不同的消费者组
  • 为不同的消费者组设置不同的并行度限制
  • 动态调整并行度设置
  • 监控不同工作负载的性能影响

常见问题(FAQ)

Q1: 如何确定合适的并行度?

A1: 确定合适并行度的方法:

  • 基于CPU数量:通常为CPU核心数的1-2倍
  • 基于操作类型:大型全表扫描可以使用较高的并行度
  • 基于数据量:数据量越大,并行度可以适当提高
  • 基于系统负载:系统负载高时使用较低的并行度
  • 基于经验:通过测试不同并行度的性能表现来确定
  • 使用自动并行度:让Oracle根据系统情况自动决定

Q2: 并行度设置过高会有什么影响?

A2: 并行度设置过高的影响:

  • 资源竞争加剧:CPU、内存、I/O资源竞争增加
  • 性能下降:过度并行可能导致整体性能下降
  • 系统不稳定:可能导致内存不足、实例崩溃等问题
  • 影响其他会话:占用过多资源,影响其他用户的性能
  • 增加管理开销:并行执行的协调和通信开销增加
  • 计划不稳定:可能导致执行计划频繁变化

Q3: 为什么我的并行执行没有生效?

A3: 并行执行不生效的常见原因:

  • 并行度策略设置不当:PARALLEL_DEGREE_POLICY设置为MANUAL
  • 表的并行度设置为NOPARALLEL:表没有启用并行
  • SQL语句不适合并行:某些SQL语句不支持并行执行
  • 系统资源不足:没有足够的资源支持并行执行
  • 并行执行被禁用:系统参数或资源管理器限制了并行执行
  • 小型操作:数据量太小,Oracle认为不需要并行执行

Q4: 如何监控并行执行的性能?

A4: 监控并行执行性能的方法:

  • 使用V$SQL_MONITOR:查看并行执行的实时状态
  • 检查执行计划:查看执行计划中的并行操作
  • 分析AWR报告:查看并行执行的统计信息和等待事件
  • 监控系统资源:跟踪CPU、内存、I/O的使用情况
  • 使用ASH报告:分析并行执行的等待事件
  • 检查V$PX_PROCESS:查看并行进程的状态

Q5: 在RAC环境中如何优化并行执行?

A5: RAC环境中优化并行执行的方法:

  • 考虑使用本地并行:设置PARALLEL_FORCE_LOCAL = TRUE
  • 优化集群 interconnect:确保网络带宽足够
  • 平衡节点负载:避免所有并行进程集中在一个节点
  • 使用服务质量:为并行执行配置适当的QoS
  • 调整并行度:根据RAC节点数调整并行度
  • 监控节点间通信:减少节点间的数据传输

Q6: 并行DML和并行查询有什么区别?

A6: 并行DML和并行查询的区别:

  • 启用方式:并行DML需要显式启用(ALTER SESSION ENABLE PARALLEL DML)
  • 锁定机制:并行DML使用不同的锁定策略
  • 日志生成:并行DML可能生成更多的redo日志
  • 性能影响:并行DML对系统的影响通常大于并行查询
  • 适用场景:并行DML适用于大型数据修改操作
  • 限制条件:某些DML操作可能不支持并行执行

Q7: 如何在高峰期管理并行执行?

A7: 高峰期管理并行执行的方法:

  • 使用资源管理器:限制高峰期的并行资源使用
  • 调度策略:将大型并行操作安排在非高峰期
  • 动态调整:根据系统负载动态调整并行度设置
  • 优先级管理:确保关键业务操作获得足够的资源
  • 监控阈值:设置系统负载阈值,超过阈值时限制并行执行
  • 自动暂停:在系统负载过高时自动暂停大型并行操作

Q8: 并行执行对备份和恢复有什么影响?

A8: 并行执行对备份和恢复的影响:

  • RMAN备份:可以使用并行备份提高速度
  • 恢复时间:并行恢复可以加快恢复速度
  • 资源使用:并行备份和恢复会增加系统资源使用
  • 备份策略:需要在备份速度和系统影响之间平衡
  • 配置建议:为RMAN设置合理的并行度
  • 监控需求:备份和恢复期间需要密切监控系统性能

Q9: 如何诊断并行执行的性能问题?

A9: 诊断并行执行性能问题的方法:

  • 检查执行计划:确认并行执行是否按预期工作
  • 分析等待事件:查看并行执行的主要等待事件
  • 监控资源使用:检查CPU、内存、I/O的使用情况
  • 检查并行度:确认实际使用的并行度是否合理
  • 查看错误信息:检查是否有与并行执行相关的错误
  • 比较执行时间:与串行执行的性能进行比较
  • 分析AWR报告:查看并行执行的统计信息

Q10: 如何文档化并行度设置?

A10: 文档化并行度设置的方法:

  • 记录设置理由:记录每个并行度设置的业务需求和技术考虑
  • 文档结构:创建包含系统级、对象级、会话级和语句级并行度设置的文档
  • 变更记录:记录并行度设置的变更历史和原因
  • 性能基准:记录不同并行度设置下的性能表现
  • 最佳实践:总结适用于特定环境的并行度设置最佳实践
  • 定期审查:定期审查并行度设置文档,确保其与实际配置一致

良好的文档化可以帮助运维团队理解并行度设置的目的,便于问题排查和未来的调整。