ORACLE并行度

本文介绍了在Oracle数据库中如何通过调整并行度来加快索引创建和重建的速度,但提醒并行度过高可能影响服务器性能。对于OLTP数据库,不建议对业务表和索引设置并行度。并行度可以通过`ALTER INDEX`和`ALTER TABLE`语句进行调整,创建和重建索引后需检查并行度是否恢复到预期。此外,还展示了如何查看并行参数、使用并行DML以及并行查询的适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在索引create 和rebuild的时候,在CPU 允许的情况下,我们可以使用parallel来加快操作的速度,但长期开并行会严重影响服务器性能。
对于OLTP类型的数据库,除非只用于做统计、报表类的表或索引,建议不对相关表或索引调置并行度。
Oracle在并行处理时,会启动多少个并行进程来同时执行任务,并行度越高, 并行进程越多,执行速度 会越快,默认是noparallel,如果我们设置并行度为default值,那么此时的并行度是:服务器CPU数*每个CPU启用的线程数(PARALLEL_THREADS_PER_CPU)
经验值是4个U对应一个并行。
所以一般我们建议使用Noparallel,或者将并行度设置为1,而不是default;可以通过dba_tables 和 dba_indexes 视图的degree 字段来查看相关对象的并行度。
【查看并行参数】
SQL> show parameter PARALLEL_THREADS_PER_CPU


NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
parallel_threads_per_cpu integer 2
SQL> show parameter parallel_max_servers

NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
parallel_max_servers integer 20

很多人会忽略一个问题:
就是在我们用并行来rebuild索引的时候,rebuild结束后,我们索引的并行度也会改成我们rebuild的并行度,所以在我们rebuild 结束之后还需要对索引的并行度进行一个修改操作。
代码操作示例如下:【创建索引开并行后关并行】
SQL> create table dave(object_id int,name varchar2(20));

Table created.

SQL> create index idx_dave_id on dave(object_id);

Index created.

SQL> select degree from all_indexes where index_name='IDX_DAVE_ID';

DEGREE
------------
1

SQL> alter index idx_dave_id rebuild parallel 4;(重建索引开并行)

Index altered.

SQL> select degree from all_indexes where index_name='IDX_DAVE_ID';

DEGREE
------------
4

SQL> alter index idx_dave_id noparallel;(索引重建完毕后关闭并行)

Index altered.

SQL> select degree from all_indexes where index_name='IDX_DAVE_ID';

DEGREE
------------
1

使用并行来处理时,我们可以通过v$px_session 来查看相关的等待事件:
SQL> select a.sql_id,a.event,count(*)from v$session a,v$px_session b where a.sid=b.sid group by a.sql_id,a.event;

no rows selected

【修改表的并行度】当设置表的并行度非常高的时候,sql优化器将可能对表进行全表扫描,引起 Direct Path Read 等待 。
alter table t parallel(degree 1);------直接指定表的并行度
alter table t parallel; ----------设置表的并行度为default

【在sql语句中使用并行(并行度设为4)】
SELECT /*+ PARALLEL(4) */ MAX(sal),AVG(comm)FROM emp,dept WHERE emp.deptno=dept.deptno GROUP BY 1;

【注意】在并行操作中默认情况并行查询和并行DDL操作可以无障碍使用并行,但是如果想使用并行DML,需要先修改dml并行配置
alter session enable parallel dml;

【并行查询的使用范围】
适用于:
大表查询,join,分区索引的查询,
创建大量的index,
创建大量的表(包括固化视图),
批量的insert,update,delete;
cpu利用不足,
足够的内存用于其他操作,排序,hash,缓存,

不适合于:
非常短的查询或事务
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值