什么是并行查询及其原理

在OLAP环境,以利用多的CPU和内存资源来加速处理数据,也即oracle 的并行查询。单个CPU同一时刻只能服务一个进程,如果有多个CPU,提高CPU利用律,就可以同时运行多个进程。也就是原来单个进程处理的变成多个进程并行处理加速执行时间。并行执行只是在全表处理或者分区及在分区表中执行本地索引时用到。下面情况会用到并行查询:http://blog.csdn.net/knowhow/archive/2008/02/03/2079682.aspx

全表扫描、 rebuild index、update (全表或分区表)、insert的并行子查询、本地索引使用、批量插入,象SQLLDR、创建临时表

比如我们执行

select /*+ parallel(c1 ,2) */     CNOUG博客首页6z @ Y b y d d5D
         ...CNOUG博客首页 t T b/U#e)u N E
    from customers c1CNOUG博客首页 d+z%[ U5v c m
order by ...process a                         process bCNOUG博客首页w-f!{ k$_.~ a
fetch rows from              fetch rows from           CNOUG博客首页3f _ { Z&^ G K
customers                     customers
5J X#Q7H*h-B0u [*o A0        ||                           ||
,m&C z8r a.} h8o0        ||                           ||CNOUG博客首页 q+U Z,n0t
       ^^                           ^^CNOUG博客首页 z6i$^)W k1} f I r G$g
process c                         process d        
.|)d L2P a A n Q x0 sort rows(a-k)               sort rows(l-z)
-p4z e q Z @ [ J)j }0                  combine rows
L6Q V Y e D u0                         ||CNOUG博客首页,I&r9l m5V(\/K/D
                return result set
,I y L!i g a7a0 这里我们看到这个进程分散成4个进程,排序中各负责a-k和l-z,这样就可以并行处理CNOUG博客首页/p u t x \5k ` \9@ V
我们在分区表中,也可以用一个并行从进程对应一个分区表如果你的并行度是3,那么你可能就比普通的执行速度提高3倍CNOUG博客首页 { c f ] j$W F T
注意在单CPU下,如果使用并行,那么就可能造成性能下降,而且也要设置合适的并行度
] k L.t7k ]7k d0 并行适合对于长时间运行的语句
:\ y7q S+d m X%e ^0 在oltp可能并不适合使用并行处理,因为事务并发比较多,每个用户都要使用CPU,CPU的负载本来就比较高
Z |4C:f a`0E ]0 所以并行处理还是比较适合olap中的批量导入,sqlldr,mis report和oltp中rebuild index。

1、看看并行选件是否安装
4e/s1_-q#}:N3h2[0 SELECT * FROM V$OPTIONCNOUG博客首页!d x5h3i F n P
看看CNOUG博客首页 { z8B!t#X"`-],u
Parallel execution是不是TRUECNOUG博客首页 g X a%{ q2n l;x:v
2、如果是TRUE,执行语句后查看
#h M | O;B%A,D5}3~.h0 select * from V$pq_sesstat;CNOUG博客首页1M4?$e }(D
如果Queries Parallelized>>0就说明是执行了并行
_ U o q }(q,m5])V0 3、可以强制使用PARALLEL,和CPU数量无关,不过在单个CPU下使用并行没有什么好处CNOUG博客首页 l r6V c-h H M
alter session force parallel query;
D Y6e!k \ [ e-d0 4、你是怎么知道语句没有使用PARALLEL?CNOUG博客首页 j w'z'O g#T
如果你用EXPLAIN ,那么有两个脚本看执行计划CNOUG博客首页 ~&p t0? ] g O#e sP o
UTLXPLS.UTLXPLP前一个是看串行计划的,后一个才能看到并行计划,CNOUG博客首页 Z%s!K s F7D'] { M
如果你使用SET AUTOTRACE,那么你如果看到P->S,那么说明计划已经是并行的了。1.与并行查询有关的参数有哪些?
4C N"\ b X(h)c t0 parallel_adaptive_multi_user boolean
+M%i u k v/P D x5{0 启用或禁用一个自适应算法,旨在提高使用并行执行方式的多用户环境的性能。通过按系统负荷自
^ r K&~ z |0 动降低请求的并行度,在启动查询时实现此功能。当 PARALLEL_AUTOMATIC_TUNING = TRUE 时,其效果最佳。
| a:q6`5T i Z0 TRUE | FALSE 如果 PARALLEL_AUTOMATIC_TUNING = TRUE,则该值为 TRUE;否则为 FALSECNOUG博客首页 _$w-l V @7~ {%i
parallel_automatic_tuning boolean
6F"D"F i%L u ~"q0 如果设置为 TRUE,Oracle 将为控制并行执行的参数确定默认值。除了设置该参数外,你还必须为
9Q {:O,C g%p P x Z0 系统中的表设置并行性。
Z i-F t _ ? L0 TRUE | FALSE FALSE
I1I e y ~ E N0 parallel_execution_message_size integer
^%B Y;@ ] i)B0 指定并行执行 (并行查询、PDML、并行恢复和复制) 消息的大小。如果值大于 2048 或 4096,就需CNOUG博客首页)M Z.p | u4j o3b)m
要更大的共享池。如果 PARALLEL_AUTOMATIC_TUNING =TRUE,将在大存储池之外指定消息缓冲区。
h9H)j:C#A j7e;Q0 2148 - 无穷大。 如果 PARALLEL_AUTOMATIC_TUNING 为 FALSE,通常值为 2148;如果CNOUG博客首页 V j)@ ] X3C | e
PARALLEL_AUTOMATIC_TUNING 为 TRUE ,则值为 4096 (根据操作系统 而定)。
5j | @ @%])b-\ s |0 parallel_max_servers integerCNOUG博客首页4` F&| e+G!y
指定一个例程的并行执行服务器或并行恢复进程的最大数量。如果需要,例程启动时分配的查询服
[1_1@,l t1Y N ?0 务器的数量将增加到该数量。
h g(c,@8m3t0 0 -256 由 CPU_COUNT, PARALLEL_AUTOMATIC_TUNING 和 PARALLEL_ADAPTIVE_MULTI_USER 确定
+|0O | X5^5V0 parallel_min_percent integerCNOUG博客首页 c.{1n X"i*G l
指定并行执行要求的线程的最小百分比。设置该参数,可以确保并行执行在没有可用的恰当查询从
$g1n"\/x a:`0 属时,会显示一个错误消息,并且该查询会因此而不予执行。CNOUG博客首页5X M A T _0y
parallel_min_servers integer
{ U:v3F | M,D!S,Z-q0 指定为并行执行启动例程后,Oracle 创建的查询服务器进程的最小数量。CNOUG博客首页 h k Q!?f0w y
0 - PARALLEL_MAX_SERVERS。
a p:^4Z R0\7}9q0 parallel_threads_per_cpu integerCNOUG博客首页 T q-q Q;k%I9y D l
说明一个 CPU 在并行执行过程中可处理的进程或线程的数量,并优化并行自适应算法和负载均衡算CNOUG博客首页 W1u p7q g C Y i
法。如果计算机在执行一个典型查询时有超负荷的迹象,应减小该数值
D o `!? V o-J0 任何非零值。 根据操作系统而定 (通常为 2)

2.当前时刻有那些并行查询在跑?
%\ { l z)x/B J0 14:13:46 SQL> desc v$px_sessionCNOUG博客首页5\ V,~ K { d1M.b B
名称 是否为空? 类型
:W1B o1y#z0 ----------------------------------------- -------- ------------------
4H!B G f ~0 SADDR RAW(4)
'u ] m S+} l6Fa g P0 SID NUMBER
;T A H y \ B {+p V.h-\0 SERIAL# NUMBERCNOUG博客首页 P |:J u6J J ? U"I'p
QCSID NUMBERCNOUG博客首页 P d1_ c T3@ L
QCSERIAL# NUMBERCNOUG博客首页 P l+D X3T/Q
QCINST_ID NUMBERCNOUG博客首页.A x y;r z e/z y
SERVER_GROUP NUMBERCNOUG博客首页 ~ g n S c J D
SERVER_SET NUMBER
4U w:Z j#i a0 SERVER# NUMBER
o5o!s \ k ` q0 DEGREE NUMBERCNOUG博客首页 S b0z&n+C X U @
REQ_DEGREE NUMBER

3.怎么才能让查询有并行执行?
_ N)o R%C t U0 如果建表时指定了并行度,例:
w ? u c f0 CREATE TABLE LI2.PAR_T
'O v3{9a x7m g i"U O0 (
!D6Q X&c E$x3g @0 a VARCHAR2 (5)CNOUG博客首页2Q ?3q+t7} G4m
)CNOUG博客首页9u(v*Z"a |(e a
PARALLEL 5;
L ]0p&f:H a i,t!})m.C0 那么对该表做全表扫描时就会并行
-_ [3v5w ]*].b m i#H8e0 14:26:05 SQL> set autot on
-~ d4| l [ h0 14:26:11 SQL> select * from par_t;

未选定行

已用时间: 00: 00: 00.02

Execution PlanCNOUG博客首页3o [ V W(P.g0V"N0}
----------------------------------------------------------CNOUG博客首页 W c-{ R ~9k
0 SELECT STATEMENT ōptimizer=CHOOSE (Cost=1 Card=82 Bytes=328)CNOUG博客首页 i N(f2x&k h(c:X#j5Z Q
1 0 TABLE ACCESS* (FULL) OF 'PAR_T' (Cost=1 Card=82 Bytes=328) :Q6000

CNOUG博客首页"_ E!g k;@ {
1 PARALLEL_TO_SERIAL SELECT /*+ NO_EXPAND ROWID(A1) */ A1."A" FROCNOUG博客首页 O M X E3A4B
M "PAR_T" PX_GRANULE(0, BLOCK_RANGE,CNOUG博客首页 M s%D k l;{:W s:{0G&z
如果该表没有指定并行度,可以在查询时用hint 实现,例:
4_5F5| z T"\7x h0 select /*+ full(t) parallel(t,5) */ * from your_table t where ...;

4.为什么本该并行执行的查询没有并行执行呢?CNOUG博客首页 w ?)s E `4M
系统的并行度由parallel_max_servers 决定,如果它的并行度为5.如果有一个并行度为5的查询在跑,那么系统在这条查询运行完成前是不能再跑并行查询的,该并行查询将会以非并行方式运行.

5如果有并行度低于系统最大并行数的查询在跑,那接下来的并行查询会怎么跑呢?CNOUG博客首页 } `8Z x C
When you specify parallel degree 4 oracle tries to allocate 4 producer slaves and 4 consumer slaves. The producers can feed any of the consumers.CNOUG博客首页'| c:` a"|"]-i2Q Q L
If there are only 2 slaves available then we use these.CNOUG博客首页 J | z H S n [
If there is only 1 slave available then we go serialCNOUG博客首页 ~ E)Z$i!a;} N
If there are none available then we use serial.
t a7i.F%U#N!V%k0 If parallel_min_percent is set then we error ora 12827 instead of using a lower number of slaves or going serial

6.设定parallel_max_servers 多大为好?
d H G i,D0N0 在多CPU的环境中,一般把CPU-1或CPU的数量做个最大并行数,因为并行查询运行时还需要一个进程协调各并行进程.对于单CPU没什么好说的.

7.并行查询能提高系统的性能吗?CNOUG博客首页*`*s j7l c {
并行查询运行时,很容易会使机器运行在高负荷下,令系统对其它事务的处理时间大大加长.并行查询一般适合在非业务高峰值人工执行,并不适合在程序中指定运行并行查询.
@*@ o Y r0y,O ` ` H5q0 PINNER:
9I6_ @8m$g'b0 并行不等于快速,仅仅是适合在数据仓库环境,低业务请求与低并发操作的时候CNOUG博客首页*_ x t Z*g `3a s
典型的OLTP系统,如果我们的系统,是绝对不允许并行查询出现的。CNOUG博客首页-s"Y#~)T U ]2|

 

http://hi.baidu.com/irookie/blog/item/4370500f7d958d226059f3d5.html

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

«    2024年11月    »
123
45678910
11121314151617
18192021222324
252627282930
搜索
标签列表
网站分类
最新留言
    文章归档
    友情链接

    Powered By Z-BlogPHP 1.7.3

    Copyright Your WebSite.Some Rights Reserved.闽ICP备11018667号-2