外观
Oracle 并行度设置规范
并行度基础
什么是并行度
- 定义:并行度(Parallelism)是指Oracle数据库同时使用多个进程或线程执行单个SQL语句的能力
- 目的:通过并行执行提高SQL语句的执行速度,特别是处理大型数据集时
- 适用场景:大型表的全表扫描、索引创建、分区操作、数据加载等
- 优势:减少大型操作的执行时间,提高系统资源利用率
- 劣势:增加系统资源消耗,可能影响其他会话的性能
并行执行的基本原理
- 并行执行服务器:Oracle创建多个并行执行服务器进程来处理任务
- 查询协调器:负责分解任务、协调并行服务器和汇总结果
- 数据分区:将大型数据集分成多个小分区,由不同的并行服务器处理
- 并行度级别:控制参与并行执行的服务器数量
- 资源管理:通过资源管理器控制并行执行的资源使用
并行度的类型
| 并行度类型 | 描述 | 适用场景 | 设置方式 |
|---|---|---|---|
| 语句级并行度 | 为单个SQL语句设置的并行度 | 特定的大型查询或DML操作 | SQL语句中使用PARALLEL提示 |
| 对象级并行度 | 为表、索引等对象设置的并行度 | 频繁进行大型操作的对象 | ALTER TABLE/INDEX语句 |
| 会话级并行度 | 为整个会话设置的默认并行度 | 会话中多个需要并行执行的语句 | ALTER SESSION语句 |
| 系统级并行度 | 整个系统的默认并行度 | 系统范围内的并行执行 | 初始化参数 |
并行度配置参数
1. 系统级参数
| 参数名称 | 描述 | 默认值 | 建议值 | 注意事项 |
|---|---|---|---|---|
| PARALLEL_MAX_SERVERS | 系统中并行执行服务器的最大数量 | CPU_COUNT * 2 | CPU_COUNT * 4 | 根据系统CPU和内存资源调整 |
| PARALLEL_SERVERS_TARGET | 系统中活跃并行执行服务器的目标数量 | CPU_COUNT * 2 | CPU_COUNT * 2 | 避免系统过载 |
| PARALLEL_MIN_SERVERS | 系统中保持的最小并行执行服务器数量 | 0 | 0 | 通常保持默认值 |
| PARALLEL_ADAPTIVE_MULTI_USER | 启用多用户并行度自适应 | TRUE | TRUE | 多用户环境下建议启用 |
| PARALLEL_DEGREE_POLICY | 并行度策略 | MANUAL | AUTO | 建议设置为AUTO |
| PARALLEL_DEGREE_LIMIT | 并行度上限 | CPU | 根据系统资源 | 避免过度并行 |
| PARALLEL_FORCE_LOCAL | 强制使用本地并行执行 | FALSE | FALSE | RAC环境下的设置 |
| PARALLEL_IO_CAP_ENABLED | 启用I/O并行度上限 | FALSE | TRUE | 根据存储系统性能 |
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 DDL | DDL操作的并行度 | ALTER SESSION ENABLE PARALLEL DDL | 大型DDL操作 |
| PARALLEL DML | DML操作的并行度 | 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: 文档化并行度设置的方法:
- 记录设置理由:记录每个并行度设置的业务需求和技术考虑
- 文档结构:创建包含系统级、对象级、会话级和语句级并行度设置的文档
- 变更记录:记录并行度设置的变更历史和原因
- 性能基准:记录不同并行度设置下的性能表现
- 最佳实践:总结适用于特定环境的并行度设置最佳实践
- 定期审查:定期审查并行度设置文档,确保其与实际配置一致
良好的文档化可以帮助运维团队理解并行度设置的目的,便于问题排查和未来的调整。
