DML语句限制:
1.如果DML语句用到并行度,那无论是HINT还是直接在表上设置并行度,都必须要设置alter session enable parallel dml;的这步操作是必不可少的!
2.如果并行的表更新未提交,在此基础上做任何操作无论更新还是查询都会失败,因此并行度的表其实还是有危险性的。从这里至少得出一个结论,如果应用是多表分别插入带并行度的表,并且是有事务性,需要最后一起提交的,这个应用一定会失败!所以尽量避免把表本身的属性设置为并行,这样的话会留下隐患,还是建议应用如果一定要用并行度,用HINT做设置就好了,因此最好最后要做如下操作
SQL> alter table ljb_parallel noparallel;
Table altered
3.另外如果表中只是索引有并行度,并不存在表带并行度的问题,不提交继续操作是不会报错的。
SQL> insert into ljb_test select /*+parallel(a,4)*/ * from ljb_test a;
3.并行语句无论是DDL还是DML还是查询并行,三个方式都会用到排序,如果用户PGA设置不够大,sort_area_size区不足,或者是用户数据量过于庞大,或者说执行并行操作的次数过多,完全可能会导致大的排序动作,有可能出现大量排序在临时表空间中进行,速度越来越慢,甚至出现临时表空间不够的错误!最后还发现,如果并行插入的时候,需要维护索引,那排序数量又会比无索引的情况大大增加许多!
1、需要进行排序的操作:
A、创建索引及重建索引;
B、涉及到索引维护的并行插入
C、order by或者group by(尽可能对索引字段排序)
D、Distinct
E、union all/intersect/minus
F、sort-merge join
G、analyze命令(仅可能使用estamate而不是compute)
2、诊断及措施
Select * from v$sysstat where name like ‘%sort%’;
Sort(disk):要求Io去临时表空间的排序数目
Sort(memory):完全在memory中完成的排序数目
Sort(rows):被排序的行数合计
Sort(disk)/ Sort(memory)<5%,如果超过5%,增加sort_area_size的值。
SELECT disk.Value disk,mem.Value mem,(disk.Value/mem.Value)*100 ratio FROM v$sysstat disk,v$sysstat mem WHERE mem.NAME=’sorts (memory)’ AND disk.NAME=’sorts (disk)’;
--查询索引的并行度
SQL> select table_name,index_name,degree from user_indexes where table_name='LJB_PARALLEL';
TABLE_NAME INDEX_NAME DEGREE
------------------------------ ------------------------------ ------------
LJB_PARALLEL IDX_LJB_PARALLEL 1
--查询表的并行度设置
SQL> alter index IDX_LJB_PARALLEL parallel 4;
Index altered
SQL> select table_name,index_name,degree from user_indexes where table_name='LJB_PARALLEL';
TABLE_NAME INDEX_NAME DEGREE
------------------------------ ---------------------------------------------