Oracle并行操作――并行DML操作 (一)

2014-11-24 09:23:51 · 作者: · 浏览: 0

对大部分的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_se