SAP报表的性能优化SAP报表的性能优化
有時我們所能用的查詢條件不是很理想,比如查詢LIKP卻必須用公司代碼,而非銷售組織。
此時普通做法是用表LIKP與TVKO根據VKORG進行聯接,從而限制TVKO~BUKRS的值。
還有一種有效的辦法是,通過TVKO查詢到當期公司代碼所對應的全部銷售組織,從而組建一個RANGE出來,再根據此RANGE查詢LIKP。
提示:DATA r_vkorg TYPE RANGE OF likp-vkorg.
SIGN = ‘I’, OPTION = ‘EQ’, LOW = ‘XXXX’ 即可往r_vkorg中放入多個單值。
3,For All Entries與Select Single的比較 就個人而言,我不太喜歡For All Entries這個語句,因為它的缺點多于優點。很多人都會說,為什么呀,For All Entries不是比Select Single快么?事實到底怎樣呢,讓我們做個比較。假設我們有個內表代表銷售訂單的行項目,該內表有10萬行。此時我們要根據LIPS的VGBEL和VGPOS,查詢這些訂單行項目對應的交貨單行項目。
?
如果用SELECT SINGLE的話寫法很簡單:
LOOP AT it_vbap INTO wa_vbap.
SELECT SINGLE vbeln posnr
FROM lips INTO (wa_vbap-vbeln_vl, wa_vbap-posnr_vl)
WHERE vgbel = wa_vbap-vbeln AND
vgpos = wa_vbap-posnr AND
vgtyp = ‘C’.
? MODIFY it_vbap FROM wa_vbap.
ENDLOOP.
?
如果用For All Entries則寫法分2步:
SELECT vbeln posnr vgbel vgpos
FROM lips INTO TABLE it_lips
For All Entries IN it_vbap
WHERE vgbel = it_vbap-vbeln AND
vgpos = it_vbap-posnr AND
vgtyp = ‘C’. “此交貨單是根據訂單創建的
?
LOOP AT it_vbap INTO wa_vbap.
READ TABLE it_lips INTO wa_lips WITH KEY vgbel = wa_vbap-vbeln
vgpos = wa_vbap-vgpos.
IF sy-subrc = 0.
? wa_vbap-vbeln_vl = wa_lips-vbeln.
? wa_vbap-posnr_vl = wa_lips-posnr.
? MODIFY it_vbap FROM wa_vbap.
ENDIF.
ENDLOOP.
?
對于SELECT SINGLE而言,由于LIPS有個VGB的SAP自帶索引,每次查詢都挺快,即便循環10萬次,速度雖然快不了但也沒什么大的危害。
對于For All Entries的第一步,的確比SELECT SINGLE快些,本來10萬次的SELECT SINGLE,變成了1萬次的查詢(如果BASIS設置了參數為10),每次查詢10個訂單行項目。但是第二步就很慢了, 暫估it_lips為8萬行,則每個READ TABLE語句平均需要4萬次才能搜索到it_lips的目標行。由于it_vbap有10萬個行項目,我們一共需要搜索40億次,太慢了!
?
在此針對For All Entries的使用提出幾點意見:
(1)如果是根據某數據量大的內表用For All Entries讀取數據量小的配置表,比如TVAK/T006等,那不如把For All Entries直接去掉,把表里的幾十條數據全部取出。
(2)使用For All Entries時,SELECT語句后面的字段必須包含所查表關鍵字段。比如上面的vbeln/posnr就是lips的關鍵字段。如果不含關鍵字段,比如SELECT lfimg FROM lips For All Entries ***,那么當LIPS中兩個條目關鍵字段不同而lfimg相同時,會被SAP自動過濾掉一條。
總結
以上是生活随笔為你收集整理的SAP报表的性能优化SAP报表的性能优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 有关BAPI
- 下一篇: ABAP:判断是否汉字