實際工作中經常遇到開發人員加hint為提高資料的批處理的速度,但為了提高處理速度經常遇到並行的hint隨意使用,並行不是萬能的,不合理的使用只能阻礙執行速度,使用如下sql說明並行問題
select /*+ leading(t1) use_hash(t_lgin) parallel(t1,8) */
t1.rpo_no
,t_lgin.lgin_dt
,t_lgin.user_id
,t_lgin.user_ip
,t_lgin.clnt_ip
,t_lgin.mac_addr
,t_lgin.menu_sys_cd
,row_number() over(partition by t1.rpo_no order by t_lgin.lgin_dt desc) rnk
from mcs_hq_read.up_rpo_trace_0602 t1
,mcs_hq.hi_user_lgin t_lgin
where t_lgin.user_id = t1.req_id
and t_lgin.lgin_dt >= trunc(t1.req_dt)
and t_lgin.lgin_dt <= t1.req_dt
order by t1.rpo_no
他的執行計畫如下
select statement, goal = hint: all_rows 110412 306398 30027004
px coordinator
px send qc (order) sys :tq10003 110412 306398 30027004
window sort 110412 306398 30027004
px receive 110412 306398 30027004
px send range sys :tq10002 110412 306398 30027004
hash join 110412 306398 30027004 "t_lgin"."lgin_dt">=trunc(internal_function("t1"."req_dt")) and "t_lgin"."lgin_dt"<="t1"."req_dt"
px receive 506 396167 20996851
px send hash sys :tq10001 506 396167 20996851
px block iterator 506 396167 20996851
table access full mcs_hq_read up_rpo_trace_0602 506 396167 20996851
buffer sort
px receive 109819 35155980 1582019100
px send hash sys :tq10000 109819 35155980 1582019100
table access full mcs_hq hi_user_lgin 109819 35155980 1582019100
說明連個表在做hash連線時,驅動表是被讀到記憶體的,對驅動表再作並行,意義不大,並且並行也是消耗資源的,所以這條sql在hint的指導下執行了1分56秒,那麼如果對大表做並**況又會怎樣呢
select /*+ leading(t1) use_hash(t_lgin) parallel(t_lgin,8) */
t1.rpo_no
,t_lgin.lgin_dt
,t_lgin.user_id
,t_lgin.user_ip
,t_lgin.clnt_ip
,t_lgin.mac_addr
,t_lgin.menu_sys_cd
,row_number() over(partition by t1.rpo_no order by t_lgin.lgin_dt desc) rnk
from mcs_hq_read.up_rpo_trace_0602 t1
,mcs_hq.hi_user_lgin t_lgin
where t_lgin.user_id = t1.req_id
and t_lgin.lgin_dt >= trunc(t1.req_dt)
and t_lgin.lgin_dt <= t1.req_dt
order by t1.rpo_no
檢視執行計畫
select statement, goal = hint: all_rows 18966 306398 30027004
px coordinator
px send qc (order) sys :tq10002 18966 306398 30027004
window sort 18966 306398 30027004
px receive 18966 306398 30027004
px send range sys :tq10001 18966 306398 30027004
hash join 18966 306398 30027004 "t_lgin"."lgin_dt">=trunc(internal_function("t1"."req_dt")) and "t_lgin"."lgin_dt"<="t1"."req_dt"
buffer sort
px receive 3653 396167 20996851
px send broadcast sys :tq10000 3653 396167 20996851
table access full mcs_hq_read up_rpo_trace_0602 3653 396167 20996851
px block iterator 15227 35155980 1582019100
table access full mcs_hq hi_user_lgin 15227 35155980 1582019100
這時看到總成本18966比之前的總成本110412 小了近6倍,這說明對資料量大的表且經常從磁碟讀資料的表做並行是很有益處的。這條sql的執行時間是45秒,因此對不同物件使用並行還是有分別的。
oracle調優HINT提示
提示 hint 從oracle7 中引入,目的是彌補基於成本優化器的缺陷。提示通常用來改變 sql執行計畫,提高執行效率。1.使用提示需要遵循的原則 1 仔細檢查提示語法。盡量使用完整注釋語法 hint 2 使用表別名。如果在查詢中指定了表別名,那麼提示必須也使用表別名。例如 select inde...
JVM調優 對eclipse啟動調優紀實(2)
heap def new generation total 157248k,used 19646k 0x04b00000,0x0f5a0000,0x0f5a0000 eden space 139776k,9 used 0x04b00000,0x05788208,0x0d380000 from spa...
對mapReduce效能調優的總結
mapreduce效能調優的著手點有如下幾個 1 map輸出的壓縮 2 reducetask數量的設定 3 shuffle資料處理過程中的一些引數 分別如下 一 map的輸出壓縮 設定方法有兩種 1 通過configuration.set name,value 設定 2 通過配置檔案mapred s...