關於表的並行處理

並行執行計劃中IN-OUT含義:
Parallel to Serial(P->S):
表示一個並行操作發送數據給一個串行操作,通常是並行進程將數據發給並行調度進程
Parallel to Parallel(P->P):
表示一個並行進程操作向另一個並行操作發送數據。通常是兩個從屬進程之間的數據交流。
Parallel Combined With Parent(PCWP):
同一個從屬進程執行的並行操作,同時父操作也是並行的。
Parallel Combined With Child(PCWC):
同一個從屬進程執行的並行操作,子操作也是並行的。
Serial to Parallel(S->P):
一個串行操作發送數據給並行操作


關於並行相關的初始化參數:
parallel_max_servers
如果並行度的值大於parallel_min_servers或者當前可用的並行服務器進程
不能滿足Sql的並行執行要求,ORACLE將創建新的並行服務器進程,當前實例
總共啓動的並行服務進程不超過這個參數的設定。
parallel_adaptive_multi_user= [true|false]
默認開啓,ORACLE會根據sql執行時的負載情況,動態的調整sql的並行度。以
取得最好的性能。
parallel_min_percent
是一個百分比數值。11gR2默認爲0。如果當前的並行服務進程不足,按照百分比申請所需的
並行服務器進程。
例如:當前參數值爲50。假設一個sql需申請20個並行服務進程時,當前的並行服務進程不足,
按這個參數要求,sql必須申請到20*50%=10個並行服務器進程,如果申請不到這個數量,
會報出 ora-12827錯誤
12827, 00000, "insufficient parallel query slaves (requested %s, available %s, parallel_min_percent %s)"
// *Cause: PARALLEL_MIN_PERCENT parameter was specified and fewer than
//         the minimum number of slaves were acquired
// *Action: Either reexecute the query with a lower PARALLEL_MIN_PERCENT or
//          wait until some running queries are completed, thus freeing
//          up slaves
以下的這個parallel_min_percent官方說明。
PARALLEL_MIN_PERCENT lets you specify the minimum percentage of the requested number of parallel 
execution processes required for parallel execution. Setting this parameter ensures that parallel operations will not execute unless adequate resources are available. 
The default value of 0 means that no minimum percentage of processes has been set.

Consider the following settings:


PARALLEL_MIN_PERCENT = 50
PARALLEL_MIN_SERVERS = 5
PARALLEL_MAX_SERVERS = 10
If 8 of the 10 parallel execution processes are busy, only 2 processes are available. If you then request a query with a degree of parallelism of 8, the minimum 50% will not be met.


You can use this parameter in conjunction with PARALLEL_ADAPTIVE_MULTI_USER. In a multi-user environment, an individual user or application can set PARALLEL_MIN_PERCENT to a minimum value until sufficient resources are available on the system and an acceptable degree of parallelism is returned.

--簡單測試 dml parallel
--session

--默認degree=1
SQL> select distinct sid from v$mystat;

       SID
----------
        85
        
--session沒有 enable parallel dml
SQL> select pdml_enabled from v$session where sid =85;

PDM
---
NO

SQL> show parameter PARALLEL_ADAPTIVE_MULTI_USER;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
parallel_adaptive_multi_user         boolean     TRUE

SQL> show parameter parallel_min;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
parallel_min_percent                 integer     0
parallel_min_servers                 integer     0
parallel_min_time_threshold          string      AUTO
--創建測試表t,沒有更改表屬性parallel
SQL> create table t as select * from dba_objects;

Table created.

SQL> select degree from user_tables where table_name ='T';

DEGREE
--------------------
         1

SQL> set autotrace trace;

SQL> set linesize 1000;
--hint 開啓parallel會啓動並行處理
SQL> delete /*+parallel(2)*/ from t;

75381 rows deleted.


Execution Plan
----------------------------------------------------------
Plan hash value: 1038566389

-------------------------------------------------------------------------------------------------------
| Id  | Operation             | Name     | Rows  | Cost (%CPU)| Time     |    TQ  |IN-OUT| PQ Distrib |
-------------------------------------------------------------------------------------------------------
|   0 | DELETE STATEMENT      |          |     1 |   166   (0)| 00:00:01 |        |      |            |
|   1 |  DELETE               | T        |       |            |          |        |      |            |
|   2 |   PX COORDINATOR      |          |       |            |          |        |      |            |
|   3 |    PX SEND QC (RANDOM)| :TQ10000 |     1 |   166   (0)| 00:00:01 |  Q1,00 | P->S | QC (RAND)  |
|   4 |     PX BLOCK ITERATOR |          |     1 |   166   (0)| 00:00:01 |  Q1,00 | PCWC |            |
|   5 |      TABLE ACCESS FULL| T        |     1 |   166   (0)| 00:00:01 |  Q1,00 | PCWP |            |
-------------------------------------------------------------------------------------------------------

Note
-----
   - dynamic sampling used for this statement (level=2)
   - Degree of Parallelism is 2 because of hint


Statistics
----------------------------------------------------------
        136  recursive calls
      84329  db block gets
       1267  consistent gets
          0  physical reads
   28475984  redo size
        840  bytes sent via SQL*Net to client
        782  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
      75381  rows processed

SQL> rollback;

Rollback complete.

--不加hint 因爲表degree爲1,沒有默認啓用parallel
SQL> delete from t;

75381 rows deleted.


Execution Plan
----------------------------------------------------------
Plan hash value: 2034385699

-------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Cost (%CPU)| Time     |
-------------------------------------------------------------------
|   0 | DELETE STATEMENT   |      |     1 |   300   (1)| 00:00:04 |
|   1 |  DELETE            | T    |       |            |          |
|   2 |   TABLE ACCESS FULL| T    |     1 |   300   (1)| 00:00:04 |
-------------------------------------------------------------------

Note
-----
   - dynamic sampling used for this statement (level=2)


Statistics
----------------------------------------------------------
        157  recursive calls
      84351  db block gets
       1218  consistent gets
          0  physical reads
   28476808  redo size
        842  bytes sent via SQL*Net to client
        765  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
      75381  rows processed

SQL> rollback;

Rollback complete.
--更改parallel值,再測試一次,執行計劃並沒有更改並行度
SQL> delete /*+parallel(8)*/ from t;

75381 rows deleted.


Execution Plan
----------------------------------------------------------
Plan hash value: 1038566389

-------------------------------------------------------------------------------------------------------
| Id  | Operation             | Name     | Rows  | Cost (%CPU)| Time     |    TQ  |IN-OUT| PQ Distrib |
-------------------------------------------------------------------------------------------------------
|   0 | DELETE STATEMENT      |          |     1 |    42   (0)| 00:00:01 |        |      |            |
|   1 |  DELETE               | T        |       |            |          |        |      |            |
|   2 |   PX COORDINATOR      |          |       |            |          |        |      |            |
|   3 |    PX SEND QC (RANDOM)| :TQ10000 |     1 |    42   (0)| 00:00:01 |  Q1,00 | P->S | QC (RAND)  |
|   4 |     PX BLOCK ITERATOR |          |     1 |    42   (0)| 00:00:01 |  Q1,00 | PCWC |            |
|   5 |      TABLE ACCESS FULL| T        |     1 |    42   (0)| 00:00:01 |  Q1,00 | PCWP |            |
-------------------------------------------------------------------------------------------------------

Note
-----
   - dynamic sampling used for this statement (level=2)
   - Degree of Parallelism is 8 because of hint


Statistics
----------------------------------------------------------
        202  recursive calls
      84363  db block gets
       1712  consistent gets
          0  physical reads
   28477364  redo size
        842  bytes sent via SQL*Net to client
        782  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
      75381  rows processed

SQL> drop table t purge;

Table dropped.

--創建 degree爲4 table
SQL> create table t parallel 4 as select * from dba_objects;

Table created.

SQL> set autotrace off; 

SQL> select degree from user_tables where table_name ='T';

DEGREE
--------------------
         4
SQL> set autotrace trace;
--默認會啓動並行,無需手工hint
SQL> delete from t;

75381 rows deleted.


Execution Plan
----------------------------------------------------------
Plan hash value: 1038566389

-------------------------------------------------------------------------------------------------------
| Id  | Operation             | Name     | Rows  | Cost (%CPU)| Time     |    TQ  |IN-OUT| PQ Distrib |
-------------------------------------------------------------------------------------------------------
|   0 | DELETE STATEMENT      |          |     1 |    87   (0)| 00:00:02 |        |      |            |
|   1 |  DELETE               | T        |       |            |          |        |      |            |
|   2 |   PX COORDINATOR      |          |       |            |          |        |      |            |
|   3 |    PX SEND QC (RANDOM)| :TQ10000 |     1 |    87   (0)| 00:00:02 |  Q1,00 | P->S | QC (RAND)  |
|   4 |     PX BLOCK ITERATOR |          |     1 |    87   (0)| 00:00:02 |  Q1,00 | PCWC |            |
|   5 |      TABLE ACCESS FULL| T        |     1 |    87   (0)| 00:00:02 |  Q1,00 | PCWP |            |
-------------------------------------------------------------------------------------------------------

Note
-----
   - dynamic sampling used for this statement (level=2)


Statistics
----------------------------------------------------------
         30  recursive calls
      84222  db block gets
       1625  consistent gets
          0  physical reads
   28474736  redo size
        845  bytes sent via SQL*Net to client
        765  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
      75381  rows processed


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章