日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SAP报表的性能优化SAP报表的性能优化

發布時間:2025/3/20 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SAP报表的性能优化SAP报表的性能优化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
大部分ABAPer都是從SAP報表及打印開始學起的,大家也都認為寫個SAP報表程序是最簡單不過的事了。 但是實際情況真的如此嗎?寫報表時除了保證數據的準確性,您可曾考慮過報表的性能問題嗎? 由于報表程序是被最多SAP用戶所訪問的,所以性能差的報表很可能會引來大量的抱怨和質疑,大大降低用戶滿意度。 最近做了較多性能優化方面的工作,頗有感觸,在此進行歸納總結,希望對大家有所幫助,也歡迎大家討論。 1,關于表連接語句(INNER JOIN, LEFT JOIN...) 寫報表的時候,表與表之間的關聯是不可避免的。通常而言,表連接語句要掌握的原則有: (1) 將最有效的查詢條件所對應的表放在第一位。換言之,讓查詢第一個表后所得到的結果集就盡可能小。 比如有一張報表叫做訂單狀態統計表,可能查完VBAK、VBAP后還查詢LIPS、VTTP等,界面上的查詢條件很多。不過據了解得知,該報表主要是查看昨天創建或前幾天創建的訂單。那么最有效的限制條件自然是訂單創建日期,以及銷售組織了,而表連接的主表宜選用VBAK。 (2) 確定了表連接的次序后,應考慮將查詢條件盡量限制在靠前的表里。比如選擇屏幕上有個物料號的查詢條件,而我們知道訂單VBAP和交貨單LIPS均有物料號,那就應該視情況而定,如果表連接中VBAP更早出現,那么WHERE子句中就使用vbap~matnr IN s_matnr,反之就是lips~matnr IN s_matnr。 (3) 兩個表之間進行連接的時候,應考慮關鍵字段或索引字段的作用。比如查詢VTTP和LIPS時,關聯關系是vttp~vbeln = lips~vbeln。那么vttp在前,lips在后,就會比較快,因為根據vttp的vbeln查詢lips時,vbeln是lips的關鍵字段,速度較快。而反過來如果lips在前,那根據lips~vbeln查詢vttp會慢一些,除非vbeln是vttp的索引字段。 2,先構建RANGE 再執行SQL語句

有時我們所能用的查詢條件不是很理想,比如查詢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报表的性能优化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。