ABAP 對RESB表取數效能影響
阿新 • • 發佈:2019-01-03
系統環境:
ECC6 EHP7 IBM-P740 192G RAM IBM-P7+ 32CORE ORACLE 11.2.0.3
症狀:
ZPPR0001_NEW生產訂單批量報工程式 ,運行於每天凌晨2:30, 執行速度緩慢。
2015-09-14,程式在9:00才執行完畢。
2015-09-15,程式在6:00才執行完畢。
2015-09-16,程式在10:00才執行完畢。
在上班時間進行報工處理,會被其它業務鎖定物料,無法處理物料投料,形成大量COGI資訊,程式需要效能調優。
原因:
執行ZPPR0001_NEW程式,SE30統計 有一行對RESB表讀取的程式碼,佔用了大量的時間:
SELECT COUNT(*) FROM RESB WHERE AUFNR = GOODSMVT_ITEM-ORDERID "生產訂單 AND MATNR = GOODSMVT_ITEM-MATERIAL "物料 AND RGEKZ = 'X' "反衝 AND XLOEK = '' "刪除
該SQL的作用是在RESB中確認生產訂單元件的物料是否允許投料和是否是刪除的。
如果滿足,該物料會被用於生產訂單。後續會把寄售型別轉為自有型別投料。
解決辦法:
減少該SQL語句的查詢時間。
一開始,我只關注該SQL本身是否有優化的可能,進展不大。
後來結合上下文程式,發現前段程式出現的查詢條件中有關鍵字還沒有利用起來。
在查詢條件中加入關鍵字後的程式碼:
SELECT COUNT(*) FROM RESB UP TO 1 ROWS WHERE AUFNR = GOODSMVT_ITEM-ORDERID "生產訂單 1100003114 AND MATNR = GOODSMVT_ITEM-MATERIAL "物料 10008733L01 AND RGEKZ = 'X' "反衝 AND XLOEK = '' "刪除 AND RSNUM = GOODSMVT_ITEM-RESERV_NO "預留號 劉欣新增 2015-09-15 AND RSPOS = GOODSMVT_ITEM-RES_ITEM . "專案 劉欣新增 2015-09-15
結果:
優化前語句,一個生產訂單測試:
優化後語句時間:
傳入生產系統後,效能提升太多,6個小時的抓資料時間,縮短為10分鐘。