oracle rac中讓sql語句在指定的節點執行的方法
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 在事務中執行sql語句SQL
- 在nhibernate中執行SQL語句SQL
- 一條SQL語句在MySQL中如何執行的MySql
- Oracle SQL 語句的執行過程OracleSQL
- oracle 中如何顯示sql語句的執行時間和sql語句的執行後的當前時間OracleSQL
- 一條sql語句在mysql中是如何執行的MySql
- 一條 SQL 語句在 MySQL 中是如何執行的?MySql
- 文章主題: 在Oracle中查詢剛才執行過的SQL語句OracleSQL
- 查詢Oracle正在執行的SQL語句OracleSQL
- 理解oracle執行sql語句的過程OracleSQL
- 查詢Oracle正在執行的sql語句及執行該語句的使用者OracleSQL
- 後臺執行SQL語句(oracle)SQLOracle
- Oracle SQL語句執行步驟OracleSQL
- 在oracle中跟蹤會話執行語句的幾種方法Oracle會話
- sql語句如何執行的SQL
- 執行大的sql語句SQL
- 查詢Oracle正在執行和執行過的SQL語句OracleSQL
- ORACLE sql 語句的執行過程(SQL效能調整)OracleSQL
- 利用pl/sql執行本地的sql檔案中的sql語句SQL
- 計算節點會對收到的SQL 語句做解析、優化、執行並SQL優化
- Oracle中SQL語句執行效率的查詢與解決 (3)OracleSQL
- Oracle中SQL語句執行效率的查詢與解決 (2)OracleSQL
- Oracle中SQL語句執行效率的查詢與解決 (1)OracleSQL
- 【RAC】rac中如何指定job的執行例項
- java連線oracle執行sql語句JavaOracleSQL
- mysql的sql語句執行流程MySql
- SQL 語句的執行順序SQL
- 在ASP程式中執行SQL語句的安全性問題 (轉)SQL
- 查詢正在執行的sql語句及該語句執行的時間SQL
- RAC中job會在哪個節點執行
- Oracle中SQL語句執行效率問題的查詢與解決OracleSQL
- Oracle 行轉列的sql語句OracleSQL
- YCSB擴充套件-語句執行頻率,執行指定的測試查詢語句套件
- 獲得目標SQL語句執行計劃的方法SQL
- oracle 對比sql語句執行環境OracleSQL
- Oracle 查詢某個session正在執行的sql語句OracleSessionSQL
- 檢視當前oracle中正在執行的sql語句OracleSQL
- sql語句批量執行SQL