并行度(Degree)

并行度是指Oracle在进行并行处理时,会启动几个并行进程来同事执行任务。
注意:并非并行度越高,并行进程越多,执行速度就会越快,这里面受限的因素很多,比如系统资源、CPU数量、以及RAC架构下并行进程可能分配到各个实例上去执行,而进行的实例间数据交换的问题。
使用并行(DEGREE)
为了使SQL在执行时使用并行,可以通过以下两种方式实现
   1)在对象(表、索引等)上创建并行度
   2)使用Hint(暗示)方式
   对象上创建并行度
   一、查看对象上的并行度
  1)表上的并行度
        select degree  from user_tables where table_name=‘T1’;
  2)索引上的并行度
         select degree from user_indexes where table_name=‘T1’;
        
二、创建对象上的并行度
   1)创建表上的并行度
         create  table  t2(…) parallel  4;--并行度为4
   2)创建索引上的并行度
         create  index idx_t2 on t2(id)  parallel 4;
         
注:B树索引、位图索引以及全文索引都可以建立并行度
对象上并行度使用效果对比
未使用并行度效果:
     

使用并行度为2效果:

使用并行度为6效果

对比总结:
  1)并行度为1等同于没有并行度。
  2)并行度并非越高越好,有时反而起反作用。
  3)有并行度是没有并行度的几倍甚至几十倍,数据量越大效果越明显。
修改并行度:
  1)表上修改
    alter table t2 parallel  3;--修改并行度为3
     alter table t2 parallel ;     --不设置,oracle会将其设置为默认值
 并行度默认值的计算方法
    1)非RAC架构
          服务器CPU数  *   每个CPU启用的线程数=并行度
     2)RAC环境
          所有参与并行处理的实例CPU总数  *  每个CPU启用的线程数=并行度  
1)查看实例数(RAC多个实例)
        show  parameter parallel_server_instances;

2)查看cpu个数和 每个cpu启用的线程  
        show parameter cpu

 计算方法:1*32*2=并行度
但是 基本上都不这样设置,因为太多的并行服务会消耗大量的系统资源而影响其他用户的操作,不过我们可以设置一个参数:  
      parallel_adaptive_multi_user=true;
此时oracle会根据系统的资源使用情况,动态的进行调整
1)更改表不采用并行度
       alter table t1 noparallel;
 2)使用Hint
        select /*+parallel(t1,4) */ * from t1;--并行度为4
    注:Hint是人为干预Oracle对SQL的执行计划,当Hint与对象发生冲突时,Oracle将采用Hint方式,Hint方式高于对象属性。
     由于Hint方法使SQL执行计划固定了下来,但是数据库中的数据以及系统资源是不断变化的,所以一般不建议使用hint的方式。不过凡事都不绝对,例如一个系统有一些分页操作的SQL,通过这些SQL查询最前N条数据为目的,并且还有一些报表SQL,需要全部执行完毕为目的,这种情况,我们可以设置回话级的参数来优化:
      alter session set optimizer_mode=First_rows_n;--分页
      alter session set optimizer_mode=all_rows;--报表
3)索引上使用并行度
     3.1创建索引并行度
      create bitmap index  t1_bitmap_idx on t1(id) parallel 4;
      create index t1_text_idx on t1(name) indextype is ctxsys.context parallel t;  
     3.2查看索引并行度
       select index_name ,index_type,degree from user_indexes where table_name=‘T1’;
  注:1、对于分区表,并行度不能在分区级别上设置,只能在表(索引)级设置,可以通过查看分区属性就知道分区没有并行度这个属性
            desc user_tab_partitions;
           2、索引上的并行度只有在访问索引时才可以被使用
                  select count(id) from t1;--使用并行度
                  select * from t1 where id>100;--不使用并行度
                  select * from t1 where id=100;--不使用并行度
                  select object_id from t1 where id=100;--不使用并行度


请使用浏览器的分享功能分享到微信等