oracle加并行好不好,请教--对INSERT语句加并行度是否会提高速度

本文通过实验对比了在Oracle数据库中,对INSERT语句添加并行度对执行速度的影响。作者创建了一个表并执行了两次插入操作,一次不使用并行,一次使用并行度为2。结果显示,尽管使用了并行,但实际执行时间反而增加。讨论了可能的原因,如表是新创建的空表,以及默认的日志记录模式。提到了使用NO_LOGGING选项可能会提高速度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[PHP]

create table c_t1 as select * from c_zysfcg where rownum<1;

insert into c_t1 select * from c_zysfcg where sfsj>=to_date('20060101','yyyymmdd') and sfsj<=to_date('20060331','yyyymmdd');

已创建1301555行。

已用时间:  00: 00: 47.85

Execution Plan

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

0      INSERT STATEMENT Optimizer=CHOOSE (Cost=880 Card=1186914 Bytes=90205464)

1    0   PARTITION RANGE (ITERATOR)

2    1     TABLE ACCESS (FULL) OF 'C_ZYSFCG' (Cost=880 Card=1186914 Bytes=90205464)

Statistics

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

5861  recursive calls

97458  db block gets

36944  consistent gets

16240  physical reads

137946336  redo size

850  bytes sent via SQL*Net to client

649  bytes received via SQL*Net from client

3  SQL*Net roundtrips to/from client

4  sorts (memory)

0  sorts (disk)

1301555  rows processed

rollback;

truncate table c_t1;

insert into c_t1 /*+ append */ select /*+ parallel(c_zysfcg,2) */ * from c_zysfcg where sfsj>=to_date('20060101','yyyymmdd') and sfsj<=to_date('20060331','yyyymmdd');

已创建1301555行。

已用时间:  00: 01: 60.71

Execution Plan

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

0      INSERT STATEMENT Optimizer=CHOOSE (Cost=880 Card=1186914 Bytes=90205464)

1    0   PARTITION RANGE* (ITERATOR)                                :Q12000

2    1     TABLE ACCESS* (FULL) OF 'C_ZYSFCG' (Cost=880 Card=118691 :Q120004 Bytes=90205464)

1 PARALLEL_COMBINED_WITH_PARENT

2 PARALLEL_TO_SERIAL            SELECT /*+ Q12000 NO_EXPAND ROWID(A1) */ A1."IDB",A1."XM",A1."BQDM",A1."ZKDM",A1

Statistics

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

5499  recursive calls

97499  db block gets

36883  consistent gets

16239  physical reads

137944544  redo size

857  bytes sent via SQL*Net to client

691  bytes received via SQL*Net from client

3  SQL*Net roundtrips to/from client

7  sorts (memory)

0  sorts (disk)

1301555  rows processed

2CPU

....

[/PHP]

结果很奇怪,按说使用了append应该会快些,不过c_t1是新建的空表,而且默认是logging模式,如果使用nologging也许会快些吧

Oracle提供了一种称为"并行插入(Parallel Insert)"的技术来解决并发插入时可能出现的锁表问题。并行插入允许多个会话同时插入数据,这样可以提高插入数据的效率并降低锁表的风险。 使用并行插入需要做以下几个步骤: 1. 创建表时需要指定表的并行度。例如创建一个并行度为8的表: ``` CREATE TABLE mytable ( col1 NUMBER, col2 VARCHAR2(50), ... ) PARALLEL 8; ``` 2. 在插入数据时需要使用PARALLEL提示来告诉Oracle语句需要并行执行。例如: ``` INSERT /*+ PARALLEL(mytable, 8) */ INTO mytable (col1, col2, ...) VALUES (1, 'value1', ...) ``` 这里的8表示并行度,需要和表创建时指定的并行度一致。 3. 如果在多个会话中同时执行并行插入语句,需要确保每个会话都使用不同的并行度,这样可以防止会话之间互相竞争资源。 ``` -- session 1 INSERT /*+ PARALLEL(mytable, 8) */ INTO mytable (col1, col2, ...) VALUES (1, 'value1', ...) -- session 2 INSERT /*+ PARALLEL(mytable, 16) */ INTO mytable (col1, col2, ...) VALUES (2, 'value2', ...) ``` 这里session 1使用并行度为8,session 2使用并行度为16,确保了会话之间互不干扰。 使用并行插入可以提高插入数据的效率,但需要注意的是,在表的数据量比较小的情况下,并行插入可能会降低插入数据的速度,因为并行度会引入额外的开销。因此,在使用并行插入时需要根据实际情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值