`
zhangpeng012310
  • 浏览: 61253 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Oracle并行操作——并行DML操作

 
阅读更多


对大部分的OLTP系统而言,并行DML(PDML)的应用场景不多。大多数的PDML操作集中在下面几个场景下:



ü       系统移植,从旧系统中导入原始数据和基础数据;

ü       数据仓库系统Data Warehouse定期进行大批量原始数据导入和清洗;

ü       借助一些专门的工具,如sql loader,进行数据海量导入;



本篇主要介绍并行DML操作的一些细节和注意方面。



1、环境准备



Oracle并行操作前提两个条件,其一是盈余的软硬件资源,其二是海量的大数据量操作。



//操作系统和DB环境

SQL> select * from v$version where rownum<2;



BANNER

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

Oracle Database11gEnterpriseEdition Release11.2.0.1.0 - Production



SQL> show parameter cpu_count;



NAME                                TYPE                  VALUE

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

cpu_count                           integer               4

SQL>



//数据环境

SQL> select count(*) from t;



COUNT(*)

----------

10039808



Executed in 4.072 seconds







2、并行统计量收集



为了实现CBO的正常工作,我们通常要保证Oracle数据字典中保留有关于数据表完全的统计信息描述。统计信息包括数据行数、取值分布、离散程度等等指标。收集统计量是一项比较重要的工作。当数据表很大的时候,即使使用了比例抽样的方法,进行汇总统计的数据量也是很大。所以这种场合下,是可以应用到并行技术的。



在目前的Oracle版本中,通常是使用dbms_stats包进行统计量收集。相对于过去的analyze table xxx命令,dbms_stats包对于统计量收集更加完全,应对分区状况更好。在dbms_stats方法中,存在参数degree,表示并行度,可以直接指定希望的收集并行度。





--收集统计量,指定并行度

SQL> exec dbms_stats.gather_table_stats(user,'T',cascade => true,degree => 7);

PL/SQL procedure successfully completed



Executed in15.32seconds





系统使用15.32s的时间完成了收集。



在收集过程中,我们观察v$px_session和v$px_process两个视图的状态。检查并行伺服进程池的状况。



SQL> select * from v$px_process;



SERVER_NAME STATUS          PID SPID           SID   SERIAL#

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

P006       INUSE          100 19070982            35     50729

P001       INUSE           65 13107452           178     35585

P002       INUSE           73 9633888            184     25268

P003       INUSE           85 22478986           223     33339

P000       INUSE           63 18743314           500     16029

P004       INUSE           95 14221380           509     26446

P005       INUSE           99 23068708           510     20895



7 rows selected





系统依据并行度要求,分配了7个进程进行操作。



//并行会话信息

SQL> select * from v$px_session;



SADDR  SID   SERIAL#     QCSID QCSERIAL#     DEGREE REQ_DEGREE

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

070000007D2BA680       500     16029       324     26152          7  7

070000007FE7EC70       178     35585       324     26152          7  7

070000007FE6D5D0       184     25268       324     26152          7  7

070000007FDFC2C0       223     33339       324     26152          7  7

070000007D2A0490       509     26446       324     26152          7  7

070000007D29D620       510     20895       324     26152          7   7

070000007FC94480        35     50729       324     26152          7   7

070000007D12FB00       324     26152       324           

(篇幅原因,有截取结果……)

8 rows selected





注意,在请求了并行度degree=7的情况下,Oracle根据CPU数量分配了7个并行slave进程进行操作。会话层面,七个slave进程分别对应七个会话信息进行并行操作。同时,存在一个额外会话(sid=324),充当全局协调者coordinator的角色。v$px_session中的qcsid字段含义为“Session serial number of the parallel coordinator”,就是并行操作中扮演协调者角色的进程。





如果不使用并行收集,只是简单的串行收集,我们查看一下效率情况。





//指定串行

SQL> exec dbms_stats.gather_table_stats(user,'T',cascade => true,degree => 1);

PL/SQL procedure successfully completed



Executed in46.816seconds





效果清晰可见,从原来的15s多的收集时间,放大为47s左右,几乎是三倍的损耗。





结论:对于统计量收集而言,如果作业时间可以避开业务高峰时间窗口,进行并行操作收集统计量还是一个不错的选择。





3、并行insert操作



下面进行并行insert操作,我们选择使用hint来进行并行控制。



//开启PDML的开关

SQL> alter session enable parallel dml;

Session altered



Executed in 0.016 seconds



使用hint,开启8个并行度进行insert操作。





--并行insert

SQL>insert /*+ parallel(t,8) */ into t select * from t;

10039808 rows inserted



Executed in 76.238 seconds





运行过程中,出现的并行操作过程如下。



//开启8个并行度;

SQL> select * from v$px_session;



SADDR                  SID   SERIAL#     QCSID QCSERIAL#

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

070000007FFF52E0       361      3123       324     26152

070000007FE84950       176     50028       324     26152

070000007FE7EC70       178     35508       324     26152 

070000007FE0AAF0       218      5994       324     26152

070000007D29D620       510     20829       324     26152

070000007D2A0490       509     26391       324     26152

070000007FC94480        35     50615       324     26152 

070000007FFFAFC0       359     32516       324     26152 

070000007D12FB00       324     26152       324           



9 rows selected



SQL> select * from v$px_process;

SERVER_NAME STATUS          PID SPID                   SID SERIAL#

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

P006       INUSE          100 19005590                        35     50615

P001       INUSE           69 19398710                       176     50028

P002       INUSE           73 9633968                        178     35508

P003       INUSE           85 23068694                       218      5994

P007       INUSE          102 18743298                       359     32516

P000       INUSE           66 14221352                       361      3123

P005       INUSE           99 21233884                       509     26391

P004       INUSE           95 19071188                       510     20829



8 rows selected





此时,我们尝试抽取出执行计划。



//从shared_pool中尝试获取到指定的记录;

SQL> select sql_text, sql_id, version_count from v$sqlarea where sql_text like 'insert /*+ parallel(t,8) */%';



SQL_TEXT                       SQL_ID       VERSION_COUNT

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

insert /*+ parallel(t,8) */ into t select * from t  67wymm0jhw3gv            2



Executed in 0.234 seconds





利用sql_id,尝试抽取出shared_pool中的执行计划。



//抽取出执行计划,篇幅原因,有删节……

SQL> select * from table(dbms_xplan.display_cursor('67wymm0jhw3gv',format => 'advanced',cursor_child_no => 1));

PLAN_TABLE_OUTPUT

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

SQL_ID 67wymm0jhw3gv, child number 1

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

insert /*+ parallel(t,8) */ into t select * from t

Plan hash value: 4064487821



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

| Id | Operation            | Name    | Rows | Bytes | Cost (%CPU)| Time    |   TQ |IN-OUT| PQ Distrib |

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

|  0 | INSERT STATEMENT     |         |      |      | 2718 (100)|         |       |     |           |

|  1 | PX COORDINATOR      |         |      |      |           |         |       |     |           |

|  2 |  PX SEND QC (RANDOM) | :TQ10000 | 5019K|  469M| 2718  (1)| 00:00:33 | Q1,00 | P->S | Q

|  3 |   LOAD AS SELECT    |         |      |      |           |         | Q1,00 | PCWP |           |

|  4 |    PX BLOCK ITERATOR |         | 5019K|  469M| 2718  (1)| 00:00:33 | Q1,00 | PCWC |           |

|* 5 |     TABLE ACCESS FULL| T       | 5019K|  469M| 2718  (1)| 00:00:33 | Q1,00 | PCWP |           |

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

Predicate Information (identified by operation id):

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

  5 - access(:Z>=:Z AND :Z<=:Z)

Note

-----

  -automatic DOP: Computed Degree of Parallelism is 8 because of degree limit

已选择66行。



已用时间: 00: 00: 00.40





如果不使用并行操作,进行如此规模的insert操作,会如何呢?



//使用noparallel的hint进行并行抑制;



SQL>insert /*+ noparallel */ into t select * from t;

10039808 rows inserted



Executed in 87.813 seconds





对应的执行计划如下:





SQL> select sql_text, sql_id, version_count from v$sqlarea where sql_text like 'insert /*+ noparallel */%';



SQL_TEXT                               SQL_ID VERSION_COUNT

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

insert /*+ noparallel */ into t select * from t   9u0xcrr3bcjs1            1



Executed in 0.234 seconds







SQL> select * from table(dbms_xplan.display_cursor('9u0xcrr3bcjs1',format => 'advanced',cursor_child_no => 0));



PLAN_TABLE_OUTPUT

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

SQL_ID 9u0xcrr3bcjs1, child number 0

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

insert /*+ noparallel */ into t select * from t



Plan hash value: 2153619298

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

| Id | Operation               | Name | Rows | Bytes | Cost (%CPU)| Time    |

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

|  0 | INSERT STATEMENT        |       |      |      | 19601 (100)|         |

|  1 | LOAD TABLE CONVENTIONAL |     |      |      |           |     |

|  2 |  TABLE ACCESS FULL     | T   | 5019K|  469M| 19601  (1)| 00:03:56 |

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







4、结论



本篇对PDML进行了简单的介绍,包括使用方法和并行度设置。由于篇幅原因,只介绍了并行insert和并行统计量的收集。并行update和delete本质相同,就不加以累述了。



最后,并行操作是一种带有特殊性的操作,绝对不要将其轻易作为经常性无监管下的操作。

分享到:
评论

相关推荐

    Oracle并行操作之并行查询实例解析

    Oracle数据库的并行操作特性...Parallel DML:并行DML操作。类似于Parallel Query。当要对大数据量表进行DML操作,如insert、update和delete的时候,可以考虑使用; Parallel DDL:并行DDL操作。如进行大容量数据表构建

    Oracle并行度.docx

    Orale在ddl、dml中的并行度,如何调整并行度代码。 对于一个大的任务,一般的做法是利用一个进程,串行的执行,如果系统资源足够,可以采用parallel技术,把一个大的任务分成若干个小的任务,同时启用n个进程/线程...

    用Oracle并行查询发挥多CPU的威力

    正在看的ORACLE教程是:用Oracle并行查询发挥多CPU的威力。参数 让我们进一步看看CPU的数量是如何影响这些参数的。 参数fast_start_parallel_rollback Oracle并行机制中一个令人兴奋之处是在系统崩溃时调用并行回滚...

    ORACLE9i_优化设计与系统调整

    §9.9.3 Oracle并行服务器 110 §9.10 Oracle数据库增长的规划 111 §9.10.1 不同增长表的配置 111 §9.10.2 对增长表进行规划和分析 112 第10章 数据库结构设计要点 113 §10.1 分析阶段的对表的理解 113 §10.2 ...

    Oracle高级sql学习与练习

    16、并行操作 17、扩展DDL和DML语句 18、MODEL语句 19、10G闪回查询 20、专题-行列转换 21、专题-连续值和累计值问题 22、专题-NULL和DUAL详解 23、专题-时间、数字、字符格式详解 24、专题-ORACLE字符集问题 25、...

    让Oracle跑得更快 Oracle 10g性能分析与优化思路.part2.rar

    8.5.3 并行dml操作 203 8.6 并行执行的设定 210 8.6.1 并行相关的初始化参数 210 8.6.2 并行度的设定 211 8.7 直接加载 213 8.7.1 直接加载和redo 216 8.7.2 直接加载和索引 219 8.7.3 直接加载和并行 221 8.7.4 ...

    让Oracle跑得更快 Oracle 10g性能分析与优化思路.part1.rar

    8.5.3 并行dml操作 203 8.6 并行执行的设定 210 8.6.1 并行相关的初始化参数 210 8.6.2 并行度的设定 211 8.7 直接加载 213 8.7.1 直接加载和redo 216 8.7.2 直接加载和索引 219 8.7.3 直接加载和并行 221 8.7.4 ...

    Oracle Database 11g初学者指南--详细书签版

     ·核心概念——oracle database 11g主题呈现在按逻辑组织的章节中  ·主要内容——每章要介绍的具体内容列表  ·实践练习——演示如何应用在每章学到的关键技术  ·学习效果测试——对学习效果的快速自我评估 ...

    构建最高可用Oracle数据库系统 Oracle 11gR2 RAC管理、维护与性能优化

    1.3.1双机并行 1.3.2高可用性 1.3.3易伸缩性 1.3.4低成本 1.3.5高吞吐量 1.4 RAC存在的问题 1.4.1稳定性 1.4.2高性能 1.5 RAC软件 1.5.1存储管理软件 1.5.2集群管理软件 1.5.3数据库管理软件 1.6本章小...

    Oracle 9i&10g编程艺术:深入数据库体系结构(全本)含脚本

    14.3 并行DML 628 14.4 并行DDL 631 14.4.1 并行DDL和使用外部表的数据加载 632 14.4.2 并行DDL和区段截断 634 14.5 并行恢复 643 14.6 过程并行化 643 14.6.1 并行管道函数 644 14.6.2 DIY并行化 648 14.7 ...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    3.1.1 如何选择全扫描操作 56 3.1.2 全扫描与舍弃 59 3.1.3 全扫描与多块读取 60 3.1.4 全扫描与高水位线 60 3.2 索引扫描访问方法 65 3.2.1 索引结构 66 3.2.2 索引扫描类型 68 3.2.3 索引唯一扫描 71 ...

    2021 云和恩墨大讲堂PPT汇总(50份).zip

    DML操作时索引是如何同步变化的 MogDB优化入门 MySQL备份恢复工具应用场景和使用方法 MySQL的性能 MySQL中的索引探究 Oracle 12cR2 ADG LGWR Library Cache案例分享 Oracle 10046 Trace 的取得和解析方法 Oracle ...

    深入解析Oracle.DBA入门进阶与诊断案例

    包括详细的操作步骤,具有很强的实战性和可操作性,适用于具备一定数据库基础、打算深入学习Oracle技术的数据库从业人员,尤其适用于入门、进阶以及希望深入研究Oracle技术的数据库管理人员。 第1章 数据库的启动...

    Oracle9i的init.ora参数中文说明

    Oracle9i初始化参数中文说明 Blank_trimming: 说明: 如果值为TRUE, 即使源长度比目标长度 (SQL92 兼容) 更长, 也允许分配数据。 值范围: TRUE | FALSE 默认值: FALSE serializable: 说明: 确定查询是否获取表级...

    收获不知Oracle

    上篇 开启惊喜之门——带意识地学Oracle 第1章意识,少做事从学习开始 2 1.1 选择先学什么颇有学问 2 1.1.1 梁老师课堂爆笑开场 2 1.1.2 看似跑题的手机分类 4 1.1.3 学什么先了解做什么 5 1.2 善于规划分类才有...

    OCPOCA认证考试指南全册:Oracle Database 11g(1Z0-051,1Z0-052,1Z0-053)--详细书签版(第2/2部分)

    8.1 数据操作语言(DML)语句 262 8.1.1 INSERT 262 8.1.2 UPDATE 265 8.1.3 DELETE 268 8.1.4 TRUNCATE 270 8.1.5 MERGE 271 8.1.6 DML语句失败 272 8.2 控制事务 273 8.2.1 数据库事务 273 8.2.2 执行SQL...

    oracle学习经典教程

    1.4.1.2.3 按操作划分,可分为DML 锁(data locks,数据锁)、DDL 锁 (data dictionary lock) 和System Locks。.........84 1.4.1.2.4 DML 锁..........84 1.4.1.2.5 DDL 锁(dictionary locks).........

Global site tag (gtag.js) - Google Analytics