并行主要用在DDL上,也可以说是DBA的一个强有力的工具,较少使用在查询当中。对于查询,调优SQL是最有力的方法。关于并行的使用很简单,可以通过参数,语法,或提示来进行。下面,我将一一进行介绍,并给出相应的例子(由于我的机器不是很好,可能达不到预想的效果,我会进行知识点与流程的说明)。
要使用并行,首要要确定并行度。并行度(DOP)定义了将创建并行流个数,最优的并行度对于获得好的并行性能到至关重要。Oracle可根据下面的规则来确实并行度。
(1)如果指定或请求并行执行,但没有指定并行度,默认的并行度被设置为系统CPU核数的两倍。通过参数parallel_threads_per_cpu来控制,如下:
SQL> show parameters parallel_thread
NAME TYPE
------------------------------------ ----------------------
VALUE
------------------------------
parallel_threads_per_cpu integer
2
1.查询
Sql代码
SELECT /*+ Parallel(t,8) */ * FROM emp t;
SELECT /*+ Parallel(8) */ * FROM emp t;
SELECT /*+ Parallel */ * FROM emp t;
2.创建索引
Sql代码
create index idx_emp_test on emp(empno,ename,job) nologging parallel 32;
3.执行表分析
Sql代码
EXEC DBMS_STATS.GATHER_TABLE_STATS(ownname => 'scott',tabname => 'emp', degree => 32,cascade => true);
4.插入
Sql代码
INSERT /*+ append parallel(30) */
INTO t_a
SELECT /*+ parallel(30) */
FROM t_b
-- PS:使用insert select做测试, insert加 Append后, 加不加Parallel 效果没有什么差别,不知为何. 但后面的select 不加Parallel 差别太大了
SQL> create table t
2 parallel (degree default)
3 as
4 select *
5 from all_objects
6 /
Table created.
SQL> create index t_idx on t(object_id) parallel (degree 4)
2 /
Index created.
SQL>
说明:在创建表时,我使用了默认的并行度,在创建索引时,我手工指定了并行度为4。
(6)在查询或DML中,可以使用提示(hint)来指定并行度,如下:
SQL> select /*+parallel(t 4)*/ count(*)
2 from t
3 where object_name like 'D%'
4 /
COUNT(*)
----------
1995
SQL> update /*+parallel(t)*/ t set created = sysdate
2 /
7851 rows updated.
SQL> commit;
Commit complete.
SQL> merge /*+parallel(t) parallel(o)*/ into t
2 using all_objects o on (t.object_id = o.object_id)
3 when matched then
4 update set t.created = o.created
5 /
7851 rows merged.
SQL> commit;
Commit complete.
阅读(6521) | 评论(0) | 转发(0) |