1. 程式人生 > >ABAP 對RESB表取數效能影響

ABAP 對RESB表取數效能影響

系統環境:

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分鐘。