Oracle执行计划中 并行和BUFFER SORT的问题
? ?近日開發(fā)說(shuō)某個(gè)系統(tǒng)上有個(gè)sql執(zhí)行時(shí)間忽快忽慢,讓我?guī)兔聪?#xff0c;此sql是4個(gè)表(2個(gè)千萬(wàn),2個(gè)十萬(wàn))進(jìn)行inner join操作,最后進(jìn)行count(*)聚合操作,執(zhí)行時(shí)間1--10S不等。查看執(zhí)行計(jì)劃發(fā)現(xiàn)使用了PX并行和BUFFER SORT操作,難怪忽快忽慢的,但是sql并沒(méi)有顯式加parallel,參數(shù)parallel_server也沒(méi)有啟用,這個(gè)并行和BUFFER SORT是從那來(lái)的呢?
下面通過(guò)實(shí)驗(yàn)來(lái)重現(xiàn)上面的情況:
1. PX并行和BUFFER SORT:
select /*+ parallel(e 4) parallel(d 4) */ e.ename, d.dname
? from scott.emp e, scott.dept d,scott.emp m
?where e.deptno = d.deptno
? ?and d.deptno = m.deptno
? ?and e.deptno = 10;
Execution plan:
----------------------------------------------------------------------------
| Id ?| Operation ? ? ? ? ? ? ? ? ?| Name ? ? | ? ?TQ ?|IN-OUT| PQ Distrib |
----------------------------------------------------------------------------
| ? 0 | SELECT STATEMENT ? ? ? ? ? | ? ? ? ? ?| ? ? ? ?| ? ? ?| ? ? ? ? ? ?|
| ? 1 | ?PX COORDINATOR ? ? ? ? ? ?| ? ? ? ? ?| ? ? ? ?| ? ? ?| ? ? ? ? ? ?|
| ? 2 | ? PX SEND QC (RANDOM) ? ? ?| :TQ10003 | ?Q1,03 | P->S | QC (RAND) ?|
|* ?3 | ? ?HASH JOIN BUFFERED ? ? ?| ? ? ? ? ?| ?Q1,03 | PCWP | ? ? ? ? ? ?|
| ? 4 | ? ? PX RECEIVE ? ? ? ? ? ? | ? ? ? ? ?| ?Q1,03 | PCWP | ? ? ? ? ? ?|
| ? 5 | ? ? ?PX SEND BROADCAST ? ? | :TQ10001 | ?Q1,01 | S->P | BROADCAST ?|
| ? 6 | ? ? ? PX SELECTOR ? ? ? ? ?| ? ? ? ? ?| ?Q1,01 | SCWC | ? ? ? ? ? ?|
| ? 7 | ? ? ? ?TABLE ACCESS FULL ? | EMP ? ? ?| ?Q1,01 | SCWP | ? ? ? ? ? ?|
|* ?8 | ? ? HASH JOIN ? ? ? ? ? ? ?| ? ? ? ? ?| ?Q1,03 | PCWP | ? ? ? ? ? ?|
| ? 9 | ? ? ?JOIN FILTER CREATE ? ?| :BF0000 ?| ?Q1,03 | PCWP | ? ? ? ? ? ?|
| ?10 | ? ? ? BUFFER SORT ? ? ? ? ?| ? ? ? ? ?| ?Q1,03 | PCWC | ? ? ? ? ? ?|
| ?11 | ? ? ? ?PX RECEIVE ? ? ? ? ?| ? ? ? ? ?| ?Q1,03 | PCWP | ? ? ? ? ? ?|
| ?12 | ? ? ? ? PX SEND HYBRID HASH| :TQ10000 | ? ? ? ?| S->P | HYBRID HASH|
|* 13 | ? ? ? ? ?TABLE ACCESS FULL | DEPT ? ? | ? ? ? ?| ? ? ?| ? ? ? ? ? ?|
| ?14 | ? ? ?PX RECEIVE ? ? ? ? ? ?| ? ? ? ? ?| ?Q1,03 | PCWP | ? ? ? ? ? ?|
| ?15 | ? ? ? PX SEND HYBRID HASH ?| :TQ10002 | ?Q1,02 | P->P | HYBRID HASH|
| ?16 | ? ? ? ?JOIN FILTER USE ? ? | :BF0000 ?| ?Q1,02 | PCWP | ? ? ? ? ? ?|
| ?17 | ? ? ? ? PX BLOCK ITERATOR ?| ? ? ? ? ?| ?Q1,02 | PCWC | ? ? ? ? ? ?|
|* 18 | ? ? ? ? ?TABLE ACCESS FULL | EMP ? ? ?| ?Q1,02 | PCWP | ? ? ? ? ? ?|
----------------------------------------------------------------------------
2. BUFFER SORT(積卡爾積會(huì)產(chǎn)生這個(gè)):
select e.ename, d.dname
? from scott.emp e, scott.dept d;
Execution plan:
----------------------------------------------------------------------------------
| Id ?| Operation ? ? ? ? ? ? ?| Name ? ? ? ?| Rows ?| Bytes |Cost (%CPU)| Time ?|
----------------------------------------------------------------------------------
| ? 0 | SELECT STATEMENT ? ? ? | ? ? ? ? ? ? | ? ? ?| ? ? ? |11 (100)| ? ? ? ? ?|
| ? 1 | ?MERGE JOIN CARTESIAN ?| ? ? ? ? ? ? | ?95 ?| 57780 |11 ? (0)| 00:00:01 |
| ? 2 | ? TABLE ACCESS FULL ? ?| DEPT ? ? ? ?| ? ?5 | ? 324 | 2 ? (0)| 00:00:01 |
| ? 3 | ? BUFFER SORT ? ? ? ? ?| ? ? ? ? ? ? | ? 19 | ? 856 | 9 ? (0)| 00:00:01 |
| ? 4 | ? ?INDEX FAST FULL SCAN| PK_EMP ? ? ?| ? 19 | ? 856 | 0 ? (0)| ? ? ? ? ?|
----------------------------------------------------------------------------------
查看Oracle的解釋:
? ?The BUFFER SORT operation indicates that the database is copying the data blocks obtained by the scan of pk_emp from the SGA to the PGA. This strategy avoids multiple scans of the same blocks in the database buffer cache, which would generate many logical reads and permit resource contention.
? ?最后的解決方法:給其中的2個(gè)小表加上rowid >= '0'的條件,讓表通過(guò)index rowid掃描走h(yuǎn)ash join連接,穩(wěn)定在1S內(nèi)返回結(jié)果。
疑問(wèn):原sql的PX并行是如何來(lái)的,一直沒(méi)有重現(xiàn)出。
轉(zhuǎn)載于:https://blog.51cto.com/srsunbing/1630138
總結(jié)
以上是生活随笔為你收集整理的Oracle执行计划中 并行和BUFFER SORT的问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: PHP判断是否有Get参数的方法
- 下一篇: 使用devenv/MSBuild在命令行