文章来自:http://jingyan.baidu.com/article/f3ad7d0ffb9e1109c2345b58.html
Oracle数据库的并行操作特性,其本质上就是强行榨取除数据库服务器空闲资源(主要是CPU资源),对一些高负荷大数据量数据进行分治处理。并行操作是一种非确定性的优化策略,在选择的时候需要小心对待。目前,使用并行操作特性的主要有下面几个方面:
Parallel Query:并行查询,使用多个操作系统级别的Server Process来同时完成一个SQL查询;Parallel DML:并行DML操作。类似于Parallel Query。当要对大数据量表进行DML操作,如insert、update和delete的时候,可以考虑使用;Parallel DDL:并行DDL操作。如进行大容量数据表构建、索引rebuild等操作;Parallel Recovery,并行恢复。当数据库实例崩溃重新启动,或者进行存储介质恢复的时候,可以启动并行恢复技术。从而达到减少恢复时间的目的;Procedural Parallel,过程代码并行化。对我们编写的代码片段、存储过程或者函数,可以实现执行的并行化,从而加快执行效率;1、并行查询Parallel QueryOracle数据库的并行查询是比较基础的技术,也是OLAP和Oracle Data Warehouse经常使用的一种并行技术。同本系列前面一直强调的要素相同,在确定使用并行技术之前,要确定软硬件的一些先决条件:任务task必要条件。备选进行并行操作的任务task必须是一个大任务作业,比如,长时间的查询。任务时间通常可以以分钟、小时进行计数。只有这样的任务和需要,才值得让我们冒险使用并行操作方案;资源闲置条件。只有在数据库服务器资源存在闲置的时候,才可以考虑进行并行处理。如果经常性的繁忙,贸然使用并行只能加剧资源的争用。
SQL> select count(*) from hlb;
COUNT(*)
----------
72583
SQL> alter table hlb parallel;
Table altered.
SQL> select * from v$px_process;
no rows selected
SQL> select count(*) from hlb;
COUNT(*)
----------
72583
SQL> select * from v$px_process;
SERVER_N STATUS PID
-------- ------------------ ----------
SPID SID SERIAL#
------------------------------------------------ ---------- ----------
P000 AVAILABLE 26
29838
P001 AVAILABLE 32
29840
并行伺候进程是一种特殊的Server Process,本质上是一种可共享的slave进程。专用连接模式下,一般的Server Process与Client Process是“同生共死”的关系,终身服务于一个Client Process。而伺候slave进程是通过进程池进行管理的,一旦启动初始化,就会在一定时间内驻留在系统中,等待下次并行处理到来。此时,我们检查v$process视图,也可以找到对应的信息
SQL> select count(*) from v$px_process;
COUNT(*)
----------
0
SQL> select count(*) from hlb;
COUNT(*)
----------
72583
SQL> select count(*) from v$px_process;
COUNT(*)
----------
2
SQL> select * from v$px_process;
SERVER_N STATUS PID
-------- ------------------ ----------
SPID SID SERIAL#
------------------------------------------------ ---------- ----------
P001 AVAILABLE 30
30041
P000 AVAILABLE 26
30038
在系统层面也可以查到相关pid
oracle 29753 1 0 May20 ? 00:00:00 ora_q001_orcl
oracle 29838 1 0 01:59 ? 00:00:00 ora_p000_orcl
oracle 29840 1 0 01:59 ? 00:00:00 ora_p001_orcl
oracle 29858 25685 0 02:00 pts/4 00:00:00 grep ora_
由于此时查询已经结束,对应的并行会话信息,已经消失不可见。
SQL> select * from v$px_session;
SADDR SID SERIAL# QCSID QCSERIAL#
-------- ---------- ---------- ---------- ----------
但是,如果任务的时间长,是可以捕获到对应信息的。从上面的情况看,我们执行一个并行操作时,Oracle会从伺候进程池中获取到对应的并行进程,
来进行操作。当操作完成后,伺候进程还会等待一定时间,之后回收。并行操作进程的资源消耗,通过v$px_sysstat视图查看。
SQL> col statistic for a30;
SQL> select * from v$px_process_sysstat;
STATISTIC VALUE
------------------------------ ----------
Servers In Use 0
Servers Available 0
Servers Started 2
Servers Shutdown 2
…………
…………
select sql_text, sql_id, version_count from v$sqlarea where sql_text like 'select count(*) from hlb%';
select * from table(dbms_xplan.display_cursor('c2sj5pv3xf2c3',format => 'advanced', cursor_child_no => 0));
SQL_ID c2sj5pv3xf2c3, child number 0
-------------------------------------
select count(*) from hlb
Plan hash value: 2138921590
--------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib |
--------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | 156 (100)| | | | |
| 1 | SORT AGGREGATE | | 1 | | | | | |
| 2 | PX COORDINATOR | | | | | | | |
| 3 | PX SEND QC (RANDOM) | :TQ10000 | 1 | | | Q1,00 | P->S | QC (RAND) |
| 4 | SORT AGGREGATE | | 1 | | | Q1,00 | PCWP | |
| 5 | PX BLOCK ITERATOR | | 73092 | 156 (0)| 00:00:02 | Q1,00 | PCWC | |
|* 6 | TABLE ACCESS FULL| HLB | 73092 | 156 (0)| 00:00:02 | Q1,00 | PCWP | |
--------------------------------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL$1
6 - SEL$1 / HLB@SEL$1