ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 关于Parallel query

关于Parallel query

原创 Linux操作系统 作者:pingley 时间:2012-06-12 23:33:41 0 删除 编辑
关于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 |
-------------------------------------------------------------------------------

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

请登录后发表评论 登录
全部评论

注册时间:2012-02-06

  • 博文量
    169
  • 访问量
    741098