关于Parallel query
select 语句要能够并行执行,必须满足以下的条件:
1、至少一个表是通过full table scan 方式访问的。或者index
range scan 涉及到了多个分区。
2、当执行一条select 语句涉及到full table scan 的时候,必须通过parallel hint
指定相应的表。或者表定义的时候设置了并行度。
3、当执行一条select 语句涉及到index range scan 跨多个分区的时候,必须
通过parallel_index 指定相应的索引,或者定义分区索引的时候设置了并行度。
oracle 如果决定select 语句的并行度的优先顺序。
1、检索出select语句涉及道德表和索引上的degree 和 instances 的规格说明。
选择其中设置的最大值作为并行度。
2、检查select 语句中是否有适用parallel hint 如果有适用,hint 指定的并行度
将会覆盖掉前面一个步骤的确定的并行度。
注:你可以使用noparallel、noparallel_index hint 确保select 语句不会使用
并行执行。
*******************************************************************************
employees 表没有设置并行度。
SQL> select table_name,degree
2 from user_tables
3 where table_name = 'EMPLOYEES';
TABLE_NAME DEGREE
---------- ----------
EMPLOYEES 1
所有下面这条select 语句不会采取并行操作。
SQL> select employee_id,last_name,first_name
2 from employees;
Execution Plan
----------------------------------------------------------
Plan hash value: 1445457117
-------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 108 | 2052 | 3 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| EMPLOYEES | 108 | 2052 | 3 (0)| 00:00:01 |
-------------------------------------------------------------------------------
但是我们可以通过hint 来让上面的select 语句采用并行执行。
1 select /*+parallel(emp,2)*/ employee_id,last_name,first_name
2* from employees emp
SQL> /
Execution Plan
----------------------------------------------------------
Plan hash value: 998304975
---------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib |
---------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 108 | 2052 | 2 (0)| 00:00:01 | | | |
| 1 | PX COORDINATOR | | | | | | | | |
| 2 | PX SEND QC (RANDOM)| :TQ10000 | 108 | 2052 | 2 (0)| 00:00:01 | Q1,00 | P->S | QC (RAND) |
| 3 | PX BLOCK ITERATOR | | 108 | 2052 | 2 (0)| 00:00:01 | Q1,00 | PCWC | |
| 4 | TABLE ACCESS FULL| EMPLOYEES | 108 | 2052 | 2 (0)| 00:00:01 | Q1,00 | PCWP | |
---------------------------------------------------------------------------------------------------------------
除了通过hint 提示外,我们可以通过在表级定义来让select 语句采用并行执行。
SQL> alter table employees parallel (degree 2);
Table altered.
设置employees 表的并行度为2.再来执行上面的查询。现在采用并行执行了。
SQL> select employee_id,last_name,first_name
2 from employees;
Execution Plan
----------------------------------------------------------
Plan hash value: 998304975
---------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib |
---------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 108 | 2052 | 2 (0)| 00:00:01 | | | |
| 1 | PX COORDINATOR | | | | | | | | |
| 2 | PX SEND QC (RANDOM)| :TQ10000 | 108 | 2052 | 2 (0)| 00:00:01 | Q1,00 | P->S | QC (RAND) |
| 3 | PX BLOCK ITERATOR | | 108 | 2052 | 2 (0)| 00:00:01 | Q1,00 | PCWC | |
| 4 | TABLE ACCESS FULL| EMPLOYEES | 108 | 2052 | 2 (0)| 00:00:01 | Q1,00 | PCWP | |
---------------------------------------------------------------------------------------------------------------
我们可以通过noparallel hint 来确保select 语句执行的时候不会采用并行执行。
1 select /*+noparallel*/employee_id,last_name,first_name
2* from employees
SQL> /
Execution Plan
----------------------------------------------------------
Plan hash value: 1445457117
-------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 108 | 2052 | 3 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| EMPLOYEES | 108 | 2052 | 3 (0)| 00:00:01 |
-------------------------------------------------------------------------------