oracle rac中讓sql語句在指定的節點執行的方法

eric0435發表於2013-09-05
rac中一條查詢語句並行到各個節點執行沒完成被中斷後被限制到特定節點上執行時查詢時查詢語句執行不了.
客戶情況是四個節點的11g rac,五個險種在做資料轉換,由於一個險種的有些資料轉換指令碼的查詢使用了並行執行被並行到別的節點上,而其它險種發現後將並行程式kill了.後面該險種的被kill掉的查詢語句在特定節點上執行時當查詢特定月份的資料時會卡住.產生的等待事件是gc cr request.

global cache cr request
當一個程式訪問需要一個或者多個塊時,它會首先檢查自己的CACHE是否存在該塊,如果發現沒有,就會先透過global cache賦予這些塊共享訪問的許可權,然後再訪問。假如,透過global cache 發現這些塊已經在另一個例項的CACHE裡面,那麼這些塊就會透過CACHE FUSION,在節點之間直接傳遞,同時出現global cache cr request等待事件
注意:在10G以後,global cache cr request 已經簡稱為 gc cr request

查詢語句如下:


            SELECT /*+ INDEX(MBF,IDX_MT_BIZ_FIN_DATE)USE_NL(MBF,MFF) */
                   mff.hospital_id AKB020,    --醫療機構編號
                   mff.serial_no AAZ218,    --業務序列號
                   mff.serial_fee AAZ213,    --費用序列號
                   mff.stat_type AKA063,    --統計類別
                   mff.fee_batch PKA001,    --費用批次
                   decode(mff.medi_item_type,0,'2',1,'1',2,'4',3,'5') AKE003,    --專案藥品型別(0:專案,1:西藥,2:中成藥,3:中草藥)
                   mff.item_code AKE001,    --中心藥品專案編碼
                   mff.item_name AKE002,    --中心藥品專案名稱
                   mff.his_item_code AKE005,    --醫院藥品專案編碼
                   mff.his_item_name AKE006,    --醫院藥品專案名稱
                   mff.serial_apply AAZ267,    --申請序列號
                   mff.fee_date PKA051,    --費用發生時間
                   mff.model PKA052,    --劑型
                   mff.factory PKA053,    --廠家
                   mff.standard PKA054,    --規格
                   mff.unit PKA055,    --計量單位
                   mff.price PKA056,    --單價
                   mff.dosage PKA057,    --用量
                   mff.money PKA058,    --金額
                   mff.reduce_money PKA059,    --衝減金額(主要為計算方便使用)
                   mff.usage_flag PKA060,    --使用標誌(1:出院帶藥 2:搶救用藥 3:急診)
                   mff.usage_days PKA061,    --出院帶藥天數
                   mff.opp_serial_fee PKA062,    --對應費用序列號
                   mff.input_staff PKA063,    --錄入人工號
                   mff.input_man PKA064,    --錄入人
                   mff.input_date PKA065,    --錄入時間
                   mff.calc_flag PKA066,    --計算標誌
                   mff.frozen_flag PKA067,    --費用凍結標誌,用來表識參保人所在單位的基本醫療保險被凍結期間錄入的費用。0:未凍結;1:已凍結;2:凍結已處理
                   mff.frozen_serial_fee PKA068,    --對應凍結的費用序列號
                   mff.trans_date PKA069,    --費用上傳時間
                   mff.recipe_no PKA070,    --處方號
                   mff.hos_serial PKA071,    --對應醫院費用號
                   mff.recipe_hospital_id PKA072,    --處方醫院編號
                   mff.recipe_hospital_name PKA073,    --處方醫院名稱
                   mff.doctor_no PKA074,    --處方醫生編號
                   mff.doctor_name PKA075,    --處方醫生姓名
                   mff.audit_flag PKA076,    --稽核標誌
                   mff.trans_flag PKA044,    --傳輸標誌(0:未傳輸 1:已成功傳輸 2:未成功傳輸)
                   mff.valid_flag AAE100  --有效標誌
              FROM gzyb.mt_biz_fin/*@gzybcx_link*/ mbf,
                   gzyb.mt_fee_fin/*@gzybcx_link*/ mff
             WHERE mbf.hospital_id = '004003'
               AND mbf.fin_date >= to_date('20130101', 'yyyy-mm-dd')
               AND mbf.fin_date  < to_date('20130201', 'yyyy-mm-dd')
               AND mbf.valid_flag = '1'
               AND mbf.hospital_id = mff.hospital_id
               AND mbf.serial_no = mff.serial_no;
在指定的特定節點執行上面的語句會產生gc cr request,因為之前被分發到別的節點上執行,該查詢的部分資料被快取到其它的節點上了.而現在不能並行在指定了特定例項來執行上面的查詢,所以查詢不能訪問其它節點例項的sga,因為我的機器名是JINGYONG.從下面的查詢可以看到上面的語句在沒加parallel提示時該語句是在特定節點prddb02執行的.

      SID    SERIAL# USERNAME       PROGRAM                  MACHINE
---------- ---------- -------------  -----------------------  ------------------------
      6345       1387 SICP3_GZYB     oracle@prddb02 (J001)    prddb02
      6454        371 SICP3_GZYB     oracle@prddb02           WORKGROUP\POWERSI-HP
      2508       1513 SICP3_GZYB     oracle@prddb02 (J000)    prddb02
      7865       234  SICP3_GZYB     oracle@prddb02 (J002)    WORKGROUP\JINGYONG
sid=7865,serial#=234就上面執行的sql語句.

當給上面的sql語句加上並行parallel提示

            SELECT /*+ INDEX(MBF,IDX_MT_BIZ_FIN_DATE)USE_NL(MBF,MFF) parallel(mff,1) */
                   mff.hospital_id AKB020,    --醫療機構編號
                   mff.serial_no AAZ218,    --業務序列號
                   mff.serial_fee AAZ213,    --費用序列號
                   mff.stat_type AKA063,    --統計類別
                   mff.fee_batch PKA001,    --費用批次
                   decode(mff.medi_item_type,0,'2',1,'1',2,'4',3,'5') AKE003,    --專案藥品型別(0:專案,1:西藥,2:中成藥,3:中草藥)
                   mff.item_code AKE001,    --中心藥品專案編碼
                   mff.item_name AKE002,    --中心藥品專案名稱
                   mff.his_item_code AKE005,    --醫院藥品專案編碼
                   mff.his_item_name AKE006,    --醫院藥品專案名稱
                   mff.serial_apply AAZ267,    --申請序列號
                   mff.fee_date PKA051,    --費用發生時間
                   mff.model PKA052,    --劑型
                   mff.factory PKA053,    --廠家
                   mff.standard PKA054,    --規格
                   mff.unit PKA055,    --計量單位
                   mff.price PKA056,    --單價
                   mff.dosage PKA057,    --用量
                   mff.money PKA058,    --金額
                   mff.reduce_money PKA059,    --衝減金額(主要為計算方便使用)
                   mff.usage_flag PKA060,    --使用標誌(1:出院帶藥 2:搶救用藥 3:急診)
                   mff.usage_days PKA061,    --出院帶藥天數
                   mff.opp_serial_fee PKA062,    --對應費用序列號
                   mff.input_staff PKA063,    --錄入人工號
                   mff.input_man PKA064,    --錄入人
                   mff.input_date PKA065,    --錄入時間
                   mff.calc_flag PKA066,    --計算標誌
                   mff.frozen_flag PKA067,    --費用凍結標誌,用來表識參保人所在單位的基本醫療保險被凍結期間錄入的費用。0:未凍結;1:已凍結;2:凍結已處理
                   mff.frozen_serial_fee PKA068,    --對應凍結的費用序列號
                   mff.trans_date PKA069,    --費用上傳時間
                   mff.recipe_no PKA070,    --處方號
                   mff.hos_serial PKA071,    --對應醫院費用號
                   mff.recipe_hospital_id PKA072,    --處方醫院編號
                   mff.recipe_hospital_name PKA073,    --處方醫院名稱
                   mff.doctor_no PKA074,    --處方醫生編號
                   mff.doctor_name PKA075,    --處方醫生姓名
                   mff.audit_flag PKA076,    --稽核標誌
                   mff.trans_flag PKA044,    --傳輸標誌(0:未傳輸 1:已成功傳輸 2:未成功傳輸)
                   mff.valid_flag AAE100  --有效標誌
              FROM gzyb.mt_biz_fin/*@gzybcx_link*/ mbf,
                   gzyb.mt_fee_fin/*@gzybcx_link*/ mff
             WHERE mbf.hospital_id = '004003'
               AND mbf.fin_date >= to_date('20130101', 'yyyy-mm-dd')
               AND mbf.fin_date  < to_date('20130201', 'yyyy-mm-dd')
               AND mbf.valid_flag = '1'
               AND mbf.hospital_id = mff.hospital_id
               AND mbf.serial_no = mff.serial_no;
這時查詢雖然指定了執行的特定例項還是被並行到其它節點上執行了從而能訪問其它例項sga所以查詢很快就能查詢出來
從下面的查詢可以看到當加並行parallel後上面的sql雖然是在特定例項執行但卻被並行到其它節點執行了
SID SERIAL# USERNAME PROGRAM MACHINE
---------- ---------- ------------- ----------------------- ------------------------
6345 1387 SICP3_GZYB oracle@prddb02 (J001) prddb02
6454 371 SICP3_GZYB oracle@prddb02 WORKGROUP\POWERSI-HP
2508 1513 SICP3_GZYB oracle@prddb02 (J000) prddb02

因此上面的sql在特定例項執行卡住的原因找到了.

要想讓並行程式只在單節點上執行可以設定parallel_force_local引數為true
SQL> show parameter force

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
parallel_force_local                 boolean     TRUE

如果想要讓job也在指定的節點上執行而不被並行到其它節點上執行在建立job時要指定instance引數,將instance引數指定為你要使用的節點

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26015009/viewspace-772215/,如需轉載,請註明出處,否則將追究法律責任。

相關文章