关于Oracle parallel(并行)的几个基本常识

本文详细介绍了Oracle数据库中并行处理的使用场景,包括大表全扫描、创建大表、建立索引和收集统计信息等。并行度的选择通常采用2的幂,如2、4、8等,且不应过高。并行DML需要开启session级别的设置,并在执行后及时关闭。文章还提醒,正确的并行hint写法和并行度设置对于SQL性能提升至关重要,但并非所有SQL都适合并行处理。
摘要由CSDN通过智能技术生成

1、什么时候使用并行?

常见的场景有:

a)

    普通SQL最常见的情况就是大表的全表扫描,还有就是大的索引的快速全扫描(注意,index fast full scan可以使用并行,index full scan 不能使用并行)。

    需要纠正一个误区:SQL执行慢就可以通过使用并行或是增加并行来提高速度。

    正解:并行能否发挥作用要看SQL的具体执行计划,比如标量子查询或是DB link,增大并行带来的性能提升是微乎其微的!

    多大的表算大表?

    至少要百万级以上记录的表吧。如果几亿甚至十几亿记录数的表全表扫描不使用并行,SQL的执行时间会相当长,特别是表在SQL执行的过程中如果还有其他session的DML操作的时候。

    OLTP系统的正常事务一般不会使用大表全扫描的执行计划,如果有一些统计分析的业务,建议在系统资源相对空闲的时候开启并行。

b)

    用create table As Select创建一张大表,如

    create table test parallel 16 as select .... from t1,t2 where .....;

    alter table test noparallel;

c)

    创建或重建索引

    create index idx_test on table_A(name) parallel 8;

    alter index idx_test noparallel;

d)

    大表收集统计信息,可以设置并行,如degree=>8

    其他不常见的操作还有表压缩等,一些比较耗时的分区操作也可以查查语法,看看是否支持并行操作。

2、并行度的选择

    一般使用2的幂作为并行度,如2、4、8、16等,正常情况并行度不要设置太高,建议最多不要超过32。当然,特殊情况特殊对待,强悍的系统(比如exadata),如果需要非常高的响应速度,并行度再多个几倍也不是问题。并行高的时候并发就要减少,否则可能会耗光并行资源。

3、并行hint的写法

    通常我们都会使用hint在SQL级别设置并行,一般不在表上和索引上设置并行度,所以我们上面并行创建表和索引的例子,后面都伴随着一个noparallel,如果在创建表或索引时使用了并行,要把它改成noparallel或parallel 1 :

    alter table/index table_name/index_name noparallel/parallel 1;

Hint的写法在10g和11g+有很大差别,11g+就方便很多。

10g 及以下:

    每个需要并行的表都要指定并行,如 /*+ parallel(a 4) parallel(b 4) */  ,如果SQL涉及的表较多,那么hint会比较长;如果内联视图较多,经常会出来遗漏的情况。如果某个表没有指定并行,那么就只能串行,如果某个大表忘了写,就会出现性能瓶颈。

11g+:

    只要在整个sql的任何一个关键字(select、update、insert、delete、merge)后面出现一次parallel(n),那么整个SQL相关的表,都会使用并行,在写法上非常的简洁,而且不会遗漏。现在新开发的应用都应该是11gR2以上了,忘了10g的写法吧。

 注意:

/*+ parallel */ 或 /*+ parallel 8 */是错误的并行hint写法,这些不正确的写法会导致SQL使用一个比较大的并行度,消耗大量的系统资源。

    

4、并行DML

    DML有4种,INSERT、DELETE、UPDATE还有MERGE,如:

    insert /*+ parallel(4) */ into t1 select .... from ....;

这个写法将会在select部分使用并行度为4的并行,DML部分的并行并没有真正的启用,DML的并行默认是关闭的,如果需要使用,必须在session级别通过下面命令开启:

    alter session enable parallel dml;--推荐写法

    或者alter session force parallel dml parallel n; --用force的语法,可以使下面的dml即使不用parallel的hint,也会使用并行度为n的并行。

执行这个命令后,才真正开启了DML的并行。

注意:

开启了DML的并行后,接下来的DML语句将会产生一个表锁,在commit之前,当前session 不能对该表做查询和dml操作,其他session也不能对该表做DML操作。

所以建议,并行dml语句,应该在语句执行后立即commit; 然后再关闭并行dml,完整的过程应该是:

alter session enable parallel dml;

your dml;

commit;

alter session disable parallel dml;

或者alter session force parallel dml parallel 1;

补充:

    parallel 的hint并不能保证sql一定会使用并行,如果优化器认为sql使用索引更高效,可能会使用索引而不使用并行。如果要确保SQL使用并行,有时可能要结合full 的hint,这种情况不多见。

如果您的Oracle数据库安装了Parallel Execution选项,并且您已经使用了PARALLEL提示来尝试并行执行查询,但是查询仍然未使用并行执行,请考虑以下几个可能的原因: 1. 数据库配置问题:请确保您的数据库实例已经正确配置了Parallel Execution选项。您可以通过检查V$OPTION视图中的PARALLEL选项来验证这一点。 2. 对象未以并行方式创建:如果您尝试并行执行的对象(如表、索引等)未以并行方式创建,则无法使用并行执行。您可以使用下面的命令来检查表或索引是否以并行方式创建: ``` SELECT owner, table_name, degree FROM dba_tables WHERE table_name = 'your_table_name'; ``` ``` SELECT owner, index_name, degree FROM dba_indexes WHERE table_name = 'your_table_name'; ``` 3. 并行度太低:如果您的查询使用了PARALLEL提示,但是并行度设置得太低,Oracle可能会决定不使用并行执行。您可以尝试增加并行度,例如: ``` SELECT /*+ PARALLEL(your_table_name, 8) */ * FROM your_table_name; ``` 在这个例子中,我们将并行度设置为8,您可以根据需要进行调整。 4. 查询语句不适合并行执行:某些查询语句可能不适合并行执行。例如,如果查询中包含大量的小表连接,则并行执行可能会导致性能下降。在这种情况下,您可以尝试重新编写查询,或者取消使用PARALLEL提示。 如果以上方法均未解决您的问题,请尝试检查Oracle数据库的日志文件以查看更多信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值