zoukankan      html  css  js  c++  java
  • Oracle并行FAQ(ZT)

    http://www.cnblogs.com/luoyx/archive/2011/12/26/2302587.html

    关于Oracle并行的一些简单小结。

    Ø 什么是并行?

    并行是Oracle为了提高大数据量的运算效率而提供多进程协作技术,它可以让多个CPU同时处理一个计算任务,充分使用系统资源,提高计算效率。

    Ø 什么操作支持并行?

    大部分的DML(insert/update/delete/merge)、DDL、Query都支持并行操作。

    Ø 什么情况下需要启用并行?

    并不是所有的SQL都应该使用并行。要使用并行需满足以下两个条件,否则结果可能适得其反:

    1) 机器有充分的空闲资源(CPU、内存等)

    2) 参与运算的数据量大。在当前系统初定于参与运算数据量大于10GB或者SQL运行时间超过30分钟可考虑使用并行。

    Ø 如何启用并行?

    可以用hint、alter session或者设置对象并行属性三种方式设置启用并行。三种方式任意一种就可以使并行生效,如果多种方式同时存在的话,则优先级顺序是:hint -> alter session -> table/index degree。

      hint alter session table/index degree
    Query select /*+ parallel(a,8) */count(1) from table_name a;

    alter session force parallel query parallel 8;

    select count(1) from table_name a;

    alter table table_name parallel 8;

    select count(1) from table_name a;

    DML

    默认情况下,parallel dml是禁用的,需要先用alter session启用:

    alter session enable parallel dml;

    update /*+ parallel(a,8) */ table_name a set col1=1;

    alter session force parallel dml parallel 8;

    update table_name a set col1=1;

    alter session enable parallel dml;

    alter table table_name parallel 8;

    update table_name a set col1=1;

    以上三步缺一不可。

    DDL

    alter session force parallel ddl parallel 8;

    create table table_name as select * from ……

    create table table_name parallel 8 as select * from ……

    create index index_name …… parallel 8;

    注意:

    1) 上述的alter session enable只是表示让当前会话支持并行,最终并行需要通过hint或者table/index degree来实现;而alter session force表示强制并行,无需hint等配合使用。

    2) 建议在hint或者alter session中控制并行,不要通过修改表或者索引的属性(degree)来控制。在查询频繁的情况下,把表或者索引的并行度改大可能会导致严重的性能问题。

    Ø 对于insert ……select ……如何设置并行?

    insert……select….包含两个部分,query和dml,可以为这两个部分分别设置并行度。因为insert操作是dml,因此还需要通过alter session方式把pdml启用,如:

    alter session enable parallel dml;

    insert /*+ append parallel(a,4) */ into table_a a

    select /*+ parallel(b,8) */ * from table_b b where ……;

    Ø 在存储过程/包中如何启用并行?

    参考上文所述。唯一的区别是如果需要执行alter session,则需要用动态语句执行,如:

    execute immediate ‘alter session enable parallel dml’;

    Ø 并行度该设置多大?

    一般来说,并行度越大SQL的执行效率越高,但是不建议设置超过CPU核数的并行度。在当前的RAC中,考虑到同时会有多个任务在跑,为了不影响其他任务,并行度需要严格控制在32个以下,一般的建议值是8和16。

    另外,建议并行度设置为2的n次方,如2/4/8/16/32等。

    Ø 既有DML又有query的SQL如何设置并行度?如insert …..select…..

    1) 如果写入量大,则在insert上加并行会明显提升性能;否则在insert上加并行基本没有什么意义。如:

    insert into t(game_name,num) select game_name,count(1) cnt from popt_total_login_all_his group by game_name;

    这种SQL主要瓶颈在查询上,写入量很少,因此只需要在查询部分设置并行即可。

    2) 如果查询量大,则在查询上加并行会明显提升性能;

    3) 如果写入和查询量都大,则在两个部分都要加并行,不要让其中一方成为瓶颈。

    总结起来就是:瓶颈在部分,就在这部分上加并行;如果都有瓶颈,则都加并行。

    对于pdml,建议:

    1) 由于并行dml有诸多限制和弊端,因此在写入量不大的情况下,尽量不启用并行dml。

    2) insert和query的并行度不一定要一致,可根据实际调整,一般设置query并行度大于等于insert并行度。并行度最好设置为2的n次方。

    3) 并行度不要设置超过CPU的个数

    Ø 如何查询并行是否起作用?

    1) 在SQL执行的时候,在PL/SQL DEV看是否有多个活动会话执行一个SQL

    2) SQL执行完了以后,在同一个会话查询v$pq_sesstat

    SQL> select * from v$pq_sesstat;

    STATISTIC LAST_QUERY SESSION_TOTAL

    ------------------------------ ---------- -------------

    Queries Parallelized 1 1

    DML Parallelized 0 0

    DDL Parallelized 0 0

    上面的结果中,如果last_query有非0的值,表示并行起作用了。

    其他方法先不告诉你了……

    Ø 如何控制并行度?

    可以用hint、alter session以及table/index degree指定并行度,详细请参考上文【如何启用并行】部分。

    Ø 如何跨实例并行?

    在当前的RAC环境,为了减少cache fusion,提高效率,默认情况把SQL并行限制在同一个节点执行。如果有超超大的SQL需要多个节点同时并行,则可以用如下语句来控制并行可跨越的实例:

    alter session set parallel_instance_group=dw; --可跨越4个节点

    alter session set parallel_instance_group=dw1; --限制在节点1执行

    alter session set parallel_instance_group=dw12; --限制在节点1和2执行

    alter session set parallel_instance_group=dw124; --限制在节点1/2/4三个节点执行

    以此类推。

    原则上不允许跨实例并行,如果必须跨实例,则使用前需征得DBA同意。

    Ø 为什么我的SQL达不到我设定的并行度?

    并行度受以下(不限于)条件限制:

    1) 系统的session、process参数的设定(一般不会超过)

    2) parallel_max_serversx限制。这个限定目前是256,意味着一个节点最多启动256个并行从属进程。在多用户多SQL同时执行的情况下,很容易达到这个上限。

    3) 对于个人用户,当前最多只允许4个或者10个连接同时访问数据库。这意味着个人用户下,并行度不能超过4或者10。(systemuser等程序账号不在此限制范围之内)

    Ø 并行有什么弊端?

    1) 并行dml会浪费空间,并行度越高,浪费越厉害

    2) 被并行dml影响的表需要提交或者回滚后才能被后续的SQL使用,否则会报错,这可能会影响事务的一致性。

    3) 并行容易触发异常或者bug,降低系统和程序的稳定性

  • 相关阅读:
    关系型数据库与非关系型数据库
    项目技术点总结
    小程序项目开发总结
    小程序的生命周期
    ES6中的class 与prototype
    js中的深拷贝与浅拷贝
    DOM的构建与优化
    ES6中promise总结
    react服务端渲染
    vue服务端渲染
  • 原文地址:https://www.cnblogs.com/cqubityj/p/3078075.html
Copyright © 2011-2022 走看看