oracle pq distrib,oracle 並行之並行度篇

操作內並行使用的slave process數量就是並行度dop,index&table都有dop 作為默認操作並行度default 1表示不使用並行處理

SQL> create table t1 (a int) parallel 6;

Table created.

SQL> select degree from user_tables where table_name=’T1′;

DEGREE

———-

6

SQL> alter table t1 parallel 3;

Table altered.

SQL> select degree from user_tables where table_name=’T1′;

DEGREE

———-

3

*禁用alter table(index) parallel 1 (noprallel)

#create 時候使用parallel不僅會在創建table&index時使,后續的操作ddl,dml也會使用(如果只想建表時使用,建好后修改)

SQL> create table t2 (a int) parallel;(未指定並行度)

Table created.

SQL> select degree from user_tables where table_name=’T2′;

DEGREE

———-

DEFAULT ~~~這樣使用default並行度=(cpu_count*parallel_threads_per_cpu)

SQL> show parameter cpu_count

NAME TYPE VALUE

———————————— ———– ——————————

cpu_count integer 2

SQL> show parameter parallel_thread

NAME TYPE VALUE

———————————— ———– ——————————

parallel_threads_per_cpu integer 2

SQL>

SQL> insert into t2 values (1);

1 row created.

SQL> commit;

Commit complete.

SQL> set autotrace trace exp

SQL> select * from t2;

Execution Plan

———————————————————-

Plan hash value: 1216610266

——————————————————————————–

——————————

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time

| TQ |IN-OUT| PQ Distrib |

——————————————————————————–

——————————

| 0 | SELECT STATEMENT | | 1 | 13 | 2 (0)| 00:00:01

| | | |

| 1 | PX COORDINATOR | | | | |

| | | |

| 2 | PX SEND QC (RANDOM)| :TQ10000 | 1 | 13 | 2 (0)| 00:00:01

| Q1,00 | P->S | QC (RAND) |

| 3 | PX BLOCK ITERATOR | | 1 | 13 | 2 (0)| 00:00:01

| Q1,00 | PCWC | |

| 4 | TABLE ACCESS FULL| T2 | 1 | 13 | 2 (0)| 00:00:01

| Q1,00 | PCWP | |

——————————————————————————–

——————————

Note

—–

– dynamic sampling used for this statement

SQL>

SQL> set autotrace off

SQL> select process from v$pq_tqstat;

no rows selected

可以看到 用set autotrace 后 查v$pq_tqstat norows ,這是2個原因造成的

1.set autotrace的原理

開啟autotrace時候 一個process對應 2個 session

通常情況下是一個 session對應一個 server processs,但SErVER PORCESSS 可以對應多個session

SQL> conn xh/a831115

已連接。

SQL> select distinct sid from v$mystat;

SID

———-

144

SQL> select username, sid, serial#, server, paddr, status from v$session where s

id=144;

USERNAME SID SERIAL# SERVER PADDR STATUS

—————————— ———- ———- ——— ——– ——–

XH 144 27 DEDICATED 20E4CC3C INACTIVE

SQL> select program ,addr from v$process where addr=(select paddr from v$session

where sid=144);

PROGRAM ADDR

—————————————————————- ——–

ORACLE.EXE (SHAD) 20E4CC3C

SQL> select sid from v$session where paddr=’20E4CC3C’;

SID

———-

144

SQL> set autotrace on

SQL> select sid from v$session where paddr=’20E4CC3C’;

SID

———-

144

154

2.v$pq_tqstat只提供當前session最后一次並行執行sql語句的信息

綜合2點可以看出set autotrace 最后一個session 是 執行計划的,所以v$pq_tqstat為no rows

所以 直接執行

SQL> select * from t2;

A

———-

1

SQL> SELECT dfo_number, tq_id, server_type, process, num_rows, bytes

2 FROM v$pq_tqstat

3 ORDER BY dfo_number, tq_id, server_type DESC, process;

DFO_NUMBER TQ_ID SERVER_TYP PROCESS NUM_ROWS BYTES

———- ———- ———- ———- ———- ———-

1 0 Producer P000 1 24

1 0 Producer P001 0 20

1 0 Producer P002 0 20

1 0 Producer P003 0 20

1 0 Consumer QC 1 84

可以看到啟動了4個slave process,這4個process=cpu_count*parallel_threads_per_cpu(2*2)

相關的hint:

parallel(10g,11g),no_parallel(10g,11g),parallel_index(10g,11g,9i),no_parallel_index(10g,11g)

noparallel(9i),noparallel_index(9i)

##需要知道並行hint只是告訴優化器可以使用並行,但不是強制使用並行一切還是從cost出發(重點)

declare

begin

for i in 1..1000 loop

insert into t2 values(i);

end loop;

commit;

end;

SQL> explain plan set statement_id=’t2_pp’ for select /*+parallel(t2 2)*/* from t2 where a>900;

Explained.

SQL> create index t2_id on t2 (a);

Index created.

SQL> explain plan set statement_id=’t2_id’ for select /*+parallel(t2 2)*/* from t2 where a>900;

Explained.

SQL> set linesize 1000

SQL> select * from table (dbms_xplan.display(null,’t2_pp’));

PLAN_TABLE_OUTPUT

————————————————————————————————————————————————————————————————————————————————————————————————————

Plan hash value: 1216610266

————————————————————————————————————–

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib |

————————————————————————————————————–

| 0 | SELECT STATEMENT | | 100 | 1300 | 2 (0)| 00:00:01 | | | |

| 1 | PX COORDINATOR | | | | | | | | |

| 2 | PX SEND QC (RANDOM)| :TQ10000 | 100 | 1300 | 2 (0)| 00:00:01 | Q1,00 | P->S | QC (RAND) |

| 3 | PX BLOCK ITERATOR | | 100 | 1300 | 2 (0)| 00:00:01 | Q1,00 | PCWC | |

|* 4 | TABLE ACCESS FULL| T2 | 100 | 1300 | 2 (0)| 00:00:01 | Q1,00 | PCWP | |

————————————————————————————————————–

PLAN_TABLE_OUTPUT

————————————————————————————————————————————————————————————————————————————————————————————————————

Predicate Information (identified by operation id):

—————————————————

4 – filter(“A”>900)

Note

—–

– dynamic sampling used for this statement

20 rows selected.

SQL> select * from table (dbms_xplan.display(null,’t2_id’));

PLAN_TABLE_OUTPUT

————————————————————————————————————————————————————————————————————————————————————————————————————

Plan hash value: 523330294

————————————————————————–

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

————————————————————————–

| 0 | SELECT STATEMENT | | 100 | 1300 | 2 (0)| 00:00:01 |

|* 1 | INDEX RANGE SCAN| T2_ID | 100 | 1300 | 2 (0)| 00:00:01 |

————————————————————————–

Predicate Information (identified by operation id):

—————————————————

PLAN_TABLE_OUTPUT

————————————————————————————————————————————————————————————————————————————————————————————————————

1 – access(“A”>900)

Note

—–

– dynamic sampling used for this statement

17 rows selected.

可以看到 即使在使用並行與走index時cost一樣時候還是選擇了走index(cost表面一樣,若使用trace alter session set events ’10053 trace name context forever’;看的更詳細,並行cpu cost要高些,所以選擇了走index,所以hint parallel,parallel_index只是告訴query optimizer

可以考慮並行 不是強制使用)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值