ORACLE并行度

在索引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,缓存,

不适合于:
非常短的查询或事务

猜你喜欢

转载自1050113483.iteye.com/blog/2247970