Oracel并行(parallel execution)

先看个SQL:
SQL> set pagesize 200
SQL> set linesize 400
SQL> col plan_table_output for a200
SQL> explain plan for
[@more@]
SQL> set pagesize 200
SQL> set linesize 400
SQL> col plan_table_output for a200
SQL> explain plan for
2 SELECT /*+ PARALLEL(4) */ customers.cust_first_name, customers.cust_last_name,
3 MAX(QUANTITY_SOLD), AVG(QUANTITY_SOLD)
4 FROM sales, customers
5 WHERE sales.cust_id=customers.cust_id
6 GROUP BY customers.cust_first_name, customers.cust_last_name;
Explained.
Elapsed: 00:00:00.05
SQL> select*From table(dbms_xplan.display(null,null,'typical'));
PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------------------------------
Plan hash value: 4060011603
--------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | TQ |IN-OUT| PQ Distrib |
---------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 925 | 25900 | | | |
| 1 | PX COORDINATOR | | | | | | |
| 2 | PX SEND QC (RANDOM) | :TQ10003 | 925 | 25900 | Q1,03 | P->S | QC (RAND) |
| 3 | HASH GROUP BY | | 925 | 25900 | Q1,03 | PCWP | |
| 4 | PX RECEIVE | | 925 | 25900 | Q1,03 | PCWP | |
| 5 | PX SEND HASH | :TQ10002 | 925 | 25900 | Q1,02 | P->P | HASH |
|* 6 | HASH JOIN BUFFERED | | 925 | 25900 | Q1,02 | PCWP | |
| 7 | PX RECEIVE | | 630 | 12600 | Q1,02 | PCWP | |
| 8 | PX SEND HASH | :TQ10000 | 630 | 12600 | Q1,00 | P->P | HASH |
| 9 | PX BLOCK ITERATOR | | 630 | 12600 | Q1,00 | PCWC | |
| 10 | TABLE ACCESS FULL| CUSTOMERS | 630 | 12600 | Q1,00 | PCWP | |
| 11 | PX RECEIVE | | 960 | 7680 | Q1,02 | PCWP | |
| 12 | PX SEND HASH | :TQ10001 | 960 | 7680 | Q1,01 | P->P | HASH |
| 13 | PX BLOCK ITERATOR | | 960 | 7680 | Q1,01 | PCWC | |
| 14 | TABLE ACCESS FULL| SALES | 960 | 7680 | Q1,01 | PCWP | |
------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
6 - access("SALES"."CUST_ID"="CUSTOMERS"."CUST_ID")
26 rows selected.
1,假设有两组从属进程。
2,首先扫描表customers的一组S1从属进程(4个),把扫描到的rows由充当查询协调器的服务器进程寄给另一组从属进程S2(4个)
同时建立hash table.
3,这两组从属进程是并发的进行操作的,S1充当product,S2充当consumer.当S1扫描完customers表后又去扫描sales,然后另一
组从属进程S2又并发的对扫描的结果进行hash join。
4,S1扫描完表sales后,有并行的进行hash group by操作,基本上这就是并行处理的过程。
关于DOP(并行度):DOP是一个sql语句中一个操作的并行执行的进程数量,比如一个sql语句中table scan是一个操作,hash join是一个
操作,group by是一个操作。也就是操作内并行使用的从属进程的数量。
关于default parallelism:如果我们指定了并行,但没有指定具体的dop,那么就会使用基于系统配置的默认dop,oracle文档的计算公式如下:
For a single instance, DOP = PARALLEL_THREADS_PER_CPU x CPU_COUNT
For an Oracle RAC configuration, DOP = PARALLEL_THREADS_PER_CPU x CPU_COUNT x INSTANCE_COUNT
关于并行的参数:
PARALLEL_MAX_SERVERS 默认大于0,开启并行。设置为cpu_count的8至10倍可能不错。
默认值:(CPU_COUNT x PARALLEL_THREADS_PER_CPU x (2 if PGA_AGGREGATE_TARGET > 0; otherwise 1) x 5)
parallel_adaptive_multi_user:会影响指派给服务器进程的从属进程数量。
false-如果该吃没有耗尽,请求的从属进程的数量会被指派给服务器进程。
true-随着已经指派的从属进程的数量增加,即使该池中仍然有足够的从属
进程来满足请求的并行度,请求的并行度也会被自动降级。
PARALLEL_MIN_SERVERS:当oracle数据库启动的时候创建的并行执行服务器进程数量,可以被任何并行操作使用。
-----------------------------------------------------------------------------
Parallel operations
----------------------------------------------------------------------------
并行到串行(p-s)---并行操作发送数据到串行操作。例如,每个执行计划都会用他来发送数据给查询调度进程。
并行到并行(p-p)---一个并行操作发送数据给另一个并行操作。当从在两组从属进程时就会使用到他。
并行与父操作合并(pcwp)---执行计划中的相同 从属进程并行执行一个操作及其父操作。
并行与子操作合并(pcwc)---执行计划中的相同从属进程并行执行一个操作及其自操作。因此没有通讯发生。
串行到并行(s-p)---一个串行操作发送数据给并行操作。此操作效率差,避免使用它。有两个原因会产生这个操作。
一,但已进场产生数据的速度可能没有多个进程消费数据的速度快。消费者可能花费更多的时间来等待数据而不是真正地处理数据。
其次,从串行执行的操作和并行执行的操作发送数据需要一些不必要的通讯。
PARALLEL granules:
1.partition granule(分区粒度)为一个完整的分区或子分区。这种粒度只能用在被分区的段上。
2.block range granule(块范围粒度)为段上的一个范围内的数据块,它是由数据库引擎在运行是(而不是解析时)动态定义的。
---------------------------------------------
Table queue
生产者通过SGA中一个称为表队列(table queue)的内存结构来给消费者发送数据。对于每个生产者-消费者对,都会有一个对应的表队列。
生产者使用px send来往表队列写入数据。
消费者使用px receive来从中读取数据-查询调度进程是个例外,它们使用px coordinator来进行处理。
每个表队列最多由3个(rac中有4个)缓冲区组成。每个缓冲区的大小由参数:parallel_execution_message_size来控制。默认是2152字节。
select*
from v$sgastat
where name='PX msg pool';
------------------------------------------------
查看从属进程池的状态:
select*
from v$px_process_sysstat
where statistic like'Servers%';
------------------------------------------------
禁用并行处理:
alter table t parallel 1;
alter table t noparallel;
Forcing Parallel SQL Execution:
ALTER SESSION FORCE PARALLEL DDL PARALLEL 5;
-----------------------------------------------------------
查询在会话级别是否启用了并行查询。
select pq_status
2 from v$session
3 where sid=sys_context('userenv','sid');

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25586587/viewspace-1053178/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/25586587/viewspace-1053178/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值