• oracle parellel 案例


    需要根据CPU、IO硬件信息综合考虑。但是并行虽然是和cpu核数有关,真实情况也遇到过,大量异步io的空等待。因此个人建议并行度最多不超过16,一般8就够了

    之前遇到某券商A,由于 degree 导致 AIX 的CPU 使用率飙升的问题。也遇到过某券商B核心系统上线前一晚0点转数据时 parallel 设置数量过多,导致正常只需要30分钟左右的一个数据导入,hang了两个小时。

    在开始讨论之前我们先做一个小试验:

    -- 试验A:
    -- 1a.使用HINT_a查询
    select /*+ parallel */* from test.lamajay where rownum <=3000;
    
    --2a.查看并行数量(如图-1)
    
    -- 试验B
    -- 1b.使用HINT_b查询
    select /*+ parallel (a,8)*/a.* from test.lamajay a where rownum <=5000;
    
    -- 2b.查看并行数量(如图-2)
    
    -- 总结:在我们显式设定并行参数parallel时,并行进程的数量是我们设置的数量(试验B),
    -- 但是当我们没有指定具体的数量时,这套数据库并行进程是4(试验A)
    

    图-1图-2

    为什么并行进程一会是4,一会是8,到底幕后是什么在操纵着数据库的并行进程数量呢?

    其实,一条SQL语句使用的并行度受3个层面的数值影响:

    1. hint中指定的并行度

    select /*+ parallel (a,8)*/a.* from test.lamajay a where rownum <=5000;

    2. 表的并行度,也就是表的degree(如图-3)

    select a.owner, a.table_name, a.degree  from dba_tables a where a.table_name = 'LAMAJAY' and a.owner = 'TEST';

    图-3

    alter table test.lamajay parallel 8;
    
    表已更改。
    
    select a.owner, a.table_name, a.degree  from dba_tables a where a.table_name = 'LAMAJAY' and a.owner = 'TEST';

    图-4

    3.auto DOP(Degree of Parallel)

    单节点:auto DOP = PARALLEL_THREADS_PER_CPU x CPU_COUNT

    RAC:auto DOP =PARALLEL_THREADS_PER_CPU x CPU_COUNT x INSTANCE_COUNT

    --注:默认情况下,INSTANCE_COUNT是集群中的所有节点。如果您限制并行操作可以执行的节点数量,那么INSTANCE_COUNT就是指定的数量。

     

    那么我们可能想知道,这么多策略,到底有没有优先级呢?

    其实的优先级是:

    hint>degree>auto DOP,也就是说:

    ①如果hint指定了并行度,会忽略表的degree。

    ②如果hint只指定parallel,不写具体的数字,或者表上DEGREE显示为DEFAULT,没有具体数值(alter table test.lamajay parallel不指定具体degree数值),则会使用auto DOP。

     

    另外,还有以下一些规则:

    a.如果表中有group by或者其他排序操作,以上并行度×2。

    b.RAC中,默认情况下,并行度会自动平均分配到各个节点上,比如并行度256,2个节点,则每个节点上各起128个并行进程。

    “并行度>parallel_max_servers”的判断在各个节点上进行。

    c.在PARALLEL_ADAPTIVE_MULTI_USER = TRUE 的情况下,会根据系统load(当前正在使用并行的用户数),将并行度乘以一个衰减因子。

    d.如果以上并行度>parallel_max_servers能够提供的空闲并行进程数,则最终并行度=0,也就是不并行(不使用Pnnn的进程)。

     

    举一些例子来更详细的说明它:

    例-1:如果SQL中没有使用hint,而表上degree=1则并行度=0;

    例-2:如果SQL中没有使用hint,而表上degree=DEFAULT 则并行度=PARALLEL_THREADS_PER_CPU x CPU_COUNT x INSTANCE_COUNT;

    例-3:如果SQL中没有使用hint,而表上degree>1 则并行度=表上degree;

    例-4:如果SQL中使用没有数值的hint(/*+ parallel */ ),无论表上degree的值是多少,并行度= PARALLEL_THREADS_PER_CPU x CPU_COUNT x INSTANCE_COUNT;

    例-5:如果SQL中使用带数值的hint(/*+ parallel (a,8)*/ or /*+ parallel (a 8)*/ ),无论表上degree的值是多少,并行度= hint中的数值(8);

    例-6:如果有排序操作,以上并行度×2;

    例-7:并行度分配到各个RAC节点,乘以衰减因子,如果最终并行度>parallel_max_servers能够提供的空闲并行进程数,则并行度=0;

     

    开篇提到的券商A的数据库中parallel_max_servers=3600,当表中degree设置不合理的时候,大的历史查询进来CPU就疯了。而券商B导入慢的原因是因为他们parallel=64,造成了数据库对象的争用,两者都是将相应的参数调整到合理的范围内就正常了。

    另外我们试验A中可以看到有4个进程在跑这个SQL,我们遇到的情况就属于例-4,试验B属于例-5 。

    所以一切不看配置、不看实际情况,随便设置并行的操作都是耍流氓!

  • 相关阅读:
    hdu 1240:Asteroids!(三维BFS搜索)
    hdu 2199:Can you solve this equation?(二分搜索)
    hdu 1195:Open the Lock(暴力BFS广搜)
    【ACM
    hrbustoj 1161:Leyni(树状数组练习)
    时间作为横轴的图表(morris.js)超越昨天的自己系列(8)
    Bean实例化(Spring源码阅读)-我们到底能走多远系列(33)
    Sharded实现学习-我们到底能走多远系列(32)
    初始化IoC容器(Spring源码阅读)-我们到底能走多远系列(31)
    一致性哈希算法 应用场景(转)
  • 原文地址:https://www.cnblogs.com/kakaisgood/p/13181222.html
Copyright © 2020-2023  润新知