臨上線了,需求還在改,報表也得改,需求滿足了,程式效能又不滿足了,淨折騰啊. 可客戶是付錢的上帝,所以程式要調優要改進,不然,要錢不給!
sap 系統是經典的三層架構,分為db, 應用伺服器,展示層三層.abap程式執行在應用伺服器層,訪問的資料儲存在db,而我們要做的就是把資料從db中取出來,然後送到展示層以展現給使用者. 而這裡db是作為集中式資源存在的,難以水平擴充套件,而應用伺服器則可以水平進行擴充套件以滿足系統效能需求.所以,調優要盡可能地優先在應用伺服器做,其次在 db層.而報表程式中,往往對資料庫的訪問會占用大部分的程式執行時間,而且在sap系統中,業務資料表資料量都很大, 在實現業務邏輯時,要考慮到opensql的效率問題.
1. 避免table full scan, 盡可能的使用表的索引.
在使用索引時,索引的字段要匹配其順序,並且索引的字段要盡可能靠前. 可以使用st05檢視程式使用索引的情況.
另外,有一些表並沒有直接的索引字段,譬如sd中的表如vbrk等,可以通過索引表vbrkpa等預先取得主鍵再去訪問vbrk.
有意思的是在 的ddic透明表在oracle中並沒有真正的主鍵,而是將ddic的主鍵字段作為primary index使用的.
2. 對於for all entries 的使用
它一般是根據內錶中記錄的數量分割成多條sql語句來執行,所以當內表比較大時,使用for all entries對程式執行時間有影響,使用時多考慮.
另外,連線的內錶中不要有重複紀錄,這樣會重複對資料庫的訪問.
3. 直接將資料快取在內表
譬如在訪問如sales office等資料量不大的主資料表時,可以將記錄預先讀出.
4. 使用 database hints
這是殺招,謹慎使用.
它是一些基於特定資料庫的優化技巧,使用這些技巧可以影響資料庫優化器對錶使用的訪問策略. 注意,abap語法並不能檢查它的對錯,一定要保證hints的正確性, 另外它只能用於透明表.
示例:%_hints oracle 'leading(t_01) use_nl (t_00 t_02)'.
使用t_01作為首要訪問的表,並將t_00作為內部表聯接.
note 129385 - database hints in open sql
note 130480 - database hints in open sql for oracle
ABAP 報表的事件
一,首先介紹一下 abap 的程式的型別 program type 程式型別 introductory statement 型別描述 1 report 報表 m program 螢幕程式 f function pool 函式組 k class pool 類組 j class pool 介面組 t t...
ABAP報表的事件
一,首先介紹一下abap的程式的型別 program type 程式型別 introductory statement 型別描述 1 report 報表 m program 螢幕程式 f function pool 函式組 k class pool 類組 j class pool 介面組 t typ...
ABAP 報表開發例項
在這裡示範乙個例項,講講abap開發報表的簡單過程。程式的正確與 否我們不與討論,我們只關心這個程式的編寫過程。首先,在任何程式的開始階段,我們都要確定將會用到的表。我們所講的這個程式 是查詢採購訂單是否完成的。將會用到以下三個表 ekko,ekpo,eket。程式的開頭為 report test....