關於Parallel query

pingley發表於2012-06-12
關於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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章