OracleRAC環(huán)境對(duì)并行查詢的支持
RAC環(huán)境中,一個(gè)并行的執(zhí)行可能分布到多個(gè)實(shí)例上執(zhí)行。
如果連接Oracle RAC數(shù)據(jù)庫(kù)時(shí),一個(gè)節(jié)點(diǎn)上的并發(fā)操作可以分布到多個(gè)節(jié)點(diǎn)上同時(shí)執(zhí)行。
看一個(gè)簡(jiǎn)單的例子:
SQL> CONN TEST/TEST@TESTRAC已連接。
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;
INSTANCE_NAME
----------------
testrac2
SQL > SELECT INSTANCE_NAME FROM GV$INSTANCE;
INSTANCE_NAME
----------------
testrac1
testrac2
SQL > SELECT * FROM V$VERSION;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bi
PL/SQL Release 10.2.0.3.0 - Production
CORE 10.2.0.3.0 Production
TNS for Solaris: Version 10.2.0.3.0 - Production
NLSRTL Version 10.2.0.3.0 - Production
這是一個(gè)10g的環(huán)境,下面建立一張測(cè)試表,建立過(guò)程中設(shè)置表的并行度:
SQL> CREATE TABLE T_PARALLEL PARALLEL 16
2 AS SELECT A.* FROM DBA_OBJECTS A, DBA_TABLES
3 WHERE ROWNUM <= 5000000;
表已創(chuàng)建。
SQL> SET AUTOT ON
SQL> SELECT COUNT(*) FROM T_PARALLEL;
COUNT(*)
----------
5000000
執(zhí)行計(jì)劃
----------------------------------------------------------
Plan hash value: 70256698
----------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib |
----------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 1081 (2)| 00:00:13 | | | |
| 1 | SORT AGGREGATE | | 1 | | | | | |
| 2 | PX COORDINATOR | | | | | | | |
| 3 | PX SEND QC (RANDOM) | :TQ10000 | 1 | | | Q1,00 | P- >S | QC (RAND) |
| 4 | SORT AGGREGATE | | 1 | | | Q1,00 | PCWP | |
| 5 | PX BLOCK ITERATOR | | 4588K| 1081 (2)| 00:00:13 | Q1,00 | PCWC | |
| 6 | TABLE ACCESS FULL| T_PARALLEL | 4588K| 1081 (2)| 00:00:13 | Q1,00 | PCWP | |
----------------------------------------------------------------------------------------------------------
Note
-----
- dynamic sampling used for this statement
從執(zhí)行計(jì)劃可以看到,Oracle選則了并行執(zhí)行。
新連接一個(gè)會(huì)話,在執(zhí)行上面這個(gè)并行查詢的同時(shí),檢查GV$PX_PROCESS視圖:
SQL> SELECT * FROM GV$PX_PROCESS;
INST_ID SERV STATUS PID SPID SID SERIAL#
---------- ---- --------- ---------- ------------ ---------- ----------
2 P000 IN USE 21 25120 265 13
2 PZ99 IN USE 42 25480 271 39
2 P001 IN USE 24 25122 279 1579
2 P002 IN USE 34 25124 280 602
2 P003 IN USE 35 25126 281 42
2 P004 IN USE 37 25155 284 106
2 P005 IN USE 41 25159 296 2212
1 P009 IN USE 44 27375 244 20
1 P004 IN USE 39 27336 246 504
1 P000 IN USE 24 27328 247 19
1 P005 IN USE 40 27349 251 363
1 P002 IN USE 37 27332 254 76
1 PZ99 IN USE 45 27725 265 28
1 P008 IN USE 43 27373 266 46
1 P006 IN USE 41 27369 270 64
1 P001 IN USE 32 27330 283 1980
1 P007 IN USE 42 27371 289 86
1 P003 IN USE 38 27334 311 21707
已選擇18行。
很顯然,并行查詢的16個(gè)進(jìn)程已經(jīng)分布到兩個(gè)節(jié)點(diǎn)上同時(shí)執(zhí)行了。