Oracle并行

并行执行是同时开启多个进程/线程来完成同一个任务,并行执行的每一个进程/线程都会消耗额外的硬件资源,所以并行执行的本质就是以额外的硬件资源消耗来换取执行时间的缩短。

1.DDL(建表、建索引等)并行

--并行建表
create table table_name_2 parallel 4 as select * from table_name;

--并行建索引
create index table_name_A on table_name(item_A) parallel 4;
--取消并行
alter index table_name_A noparallel;

2.DML(insert/update等)并行

--开两个并行查询
--此处注意t1,如parallel中t1找不到对应的声明,则不走索引
--注意观察执行计划是否达到预期效果
select /*+parallel(t1,2) */ * from table_name t1;

3.并行的几种方式

--1.手动开启某个表的并行并修改并行度值为默认值
--默认并行度=parallel_threads_per_cpu*cpu_count
alter table table_name parallel;
--2.手动开启某个表的并行并指定并行度值为n
alter table table_name parallel n;

--查询某表当前的并行度
select table_name,degree from user_tables where table_name='table_name';

--取消当前表并行
alter table table_name noparallel;

--手动开启当前session并行查询,并指定并行度为默认值
alter session parallel query;

--手动开启当前session并行DML,并指定并行度为默认值
alter session parallel dml;

--取消当前session并行查询
alter session disable parallel query;
--完整使用并行实例

--开启table_test表并行且并行度为4
alter table table_test parallel 4;
--查看是否开启成功,如果成功degree值应该为4
select table_name,degree from user_tables where table_name='table_test';
--并行查询
select * from table_test t1;
--关闭并行
alter table table_test noparallel;
--查看是否关闭成功
select table_name,degree from user_tables where table_name='table_test';


--或者如下
select /*+parallel(t1,2) */ * from table_test t1;

4.注意事项

1. 对于开启并行度之后的表存在事务未提交的,后续的事务一定会失败
2.手动开启并行一定要手动关闭
3.写在代码里的DML等语句无需手动开启/取消并行

发表评论

电子邮件地址不会被公开。 必填项已用*标注

16 − 10 =