當前位置:首頁 » 編程語言 » abapsql優化
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

abapsql優化

發布時間: 2022-05-23 08:34:00

Ⅰ 如何提高ABAP程序運行效率

影響ABAP程序的運行效率主要是在程序中大量數據的取得,如果取數不得方法,很影響報表的運行效率,所有優化ABAP程序主要是優化數據取數的方法。下面這幾點可以有效的提高取數的效率,從而來提高程序的運行效率。
1.選擇最有效率的表名順序(只在基於規則的優化器中有效):
ORACLE的解析器按照從右到左的順序處理FROM子句中的表名,FROM子句中寫在最後的表(基礎表
drivingtable)將被最先處理,在FROM子句中包含多個表的情況下,你必須選擇記錄條數最少的表作為基礎表。如果有3個以上的表連接查詢,
那就需要選擇交叉表(intersectiontable)作為基礎表,交叉表是指那個被其他表所引用的表。
2.WHERE子句中的連接順序:
ORACLE採用自下而上的順序解析WHERE子句,根據這個原理,表之間的連接必須寫在其他WHERE條件之前,
那些可以過濾掉最大數量記錄的條件必須寫在WHERE子句的末尾.
3.SELECT子句中避免使用

*
『:
ORACLE在解析的過程中,
會將'*'
依次轉換成所有的列名,
這個工作是通過查詢數據字典完成的,這意味著將耗費更多的時間
4.減少訪問資料庫的次數:
ORACLE在內部執行了許多工作:
解析sql語句,
估算索引的利用率,
綁定變數
,讀數據塊等。

Ⅱ ABAP語言與SQL語言的區別

ABAP中涉及對資料庫操作的語言用的是OPEN SQL。但ABAP>OPEN SQL。會SQL對ABAP肯定有幫助

Ⅲ abap中查詢多個表的數據 我用什麼SQL語句速度最快。 (用INNER JOIN 還是 用別的 請高手解答)

inner join 盡量別超過3張表
如果表多 可以查出結果集後用 FOR ALL ENTRIES IN
分開查詢 用的時候別忘查詢是否為空

Ⅳ abap 如何去程序優化的

程序的效率是每個程序員都應該重視的,無論您是採用哪一種語言進行開發. 程序有時候越短,並不一定越快,有時候程序很多代碼,但不一定會很慢. 性能是一把雙刃劍, 獲得時間效率的同時, 犧牲的是空間的開銷. 這里提供一些建議以提高你的程序運行速度和減低系統荷載。

首先是盡量減少I/O操作,類似對硬碟的讀寫的I/O操作是最耗費時間的, 比如讀寫資料庫。以下是減少I/O操作的例子:

1, 減少資料庫DB的讀寫操作, 當使用VIEW視圖的時候, 當被視圖join的table有數據更新操作的時候, 同時系統也會更新到這個view裡面, 使得它們之間的數據一樣, 所以使用視圖會對這些日常操作帶來效率問題. 如果視圖join的表多數是日常事物需要更新的事物數據表(如EKET), 就要避免使用視圖.

2, 避免使用SELECT *, 盡量使用SELECT A B C INTO TABLE ITAB這樣的語句。這個操作會將所有符合條件的數據一次性地讀進內表,這比在SELECT A B C INTO WA... APPEND... ENDSELECT的循環中添加數據到內表要快。不用頻繁的讀DB.

3, 避免頻繁使用SELECT SINGLE語句, 特別是在LOOP和SELECT...ENDSELECT裡面用, 應該把要讀取的數據用SELECT FOR ALL ENTRIES IN 一次全部取得, 然後用READ TABLE WITH KEY ... BINARY SEARCH.

雖然說操作內存比磁碟操作要高效,但是如果對內存的使用不加以控制,可能有些時候不得不對硬碟的交換空間操作, 這樣就增加了對磁碟的I/O讀寫操作.正如下面所說:

4, 當你定義內表的時候可以也會出現這樣的問題, 比如你定義一個內表使用的是OCCURS 100,而不是OCCURS 0, 會導致內表長度大於100的時候,就會佔用系統頁面緩存

5, Field-groups對於多層次的排序和顯示是非常有用的。它是將數據寫入系統的頁面文件,而不是內存(內表一般是使用內存的)。基於這個原因,field-groups比較適合於處理大量數據的列表(一般超過50000條記錄)。如果涉及大量的數據處理,應該首先和系統管理員協商來決定這個程序最多能使用多少內存,以計算這個程序需要使用多少資源。然後你就可以決定是把數據寫入內存還是交換空間。

6, 用SORT代替ORDER BY, ORDER BY從句是執行在資料庫伺服器上, 而SORT是ABAP語句執行在應用伺服器上的. 資料庫伺服器通常會形成性能瓶頸問題, 所以最好是吧數據導入內表做SORT.

7, 避免使用SELECT DISTINCT語句, 因為當你用來判斷唯一的欄位為非索引欄位時, 效率是十分的低, 所以請導入內表SORT後, 使用DELETE ADJACENT DUPLICATES 來去重復.

其次就是要減輕CPU的負載, 可以通過優化程序來改善,比如在程序中語句和演算法, 以下是減低CPU負載的優化例子:

1, 使用宏代替頻繁函數調用. ABAP沒有內聯函數這個說法, 所以我們如果需要頻繁調用函數時, 函數調用有棧內存創建和釋放的開銷. 在ABAP中可以用宏代碼提高執行效率,宏代碼不是函數但使用起來像函數,編譯器用復制宏代碼的方式取代函數調用,省去了參數壓棧、從而提高速度。注意使用宏有缺點:(1)容易出錯, 宏不能pass-by-value按值傳遞,用於代替實現函數功能時要十分注意!(2)不可調試; (3)無法操作類的私有數據成員.

2, 避免使用過得的LOOP 和SELECT .... END SELECT. 避免使用嵌套的LOOP 和SELECT .... END SELECT.

3, 盡可能多地使用表的KEY FIELD作為Where分句的條件選項。比如SELECT * FROM BSEG WHERE BUKRS = '1000' AND BELNR = '0100000007' AND GJAHR = '2006' AND BUZEI = '003'. 這里的四個欄位BUKRS,BELNR,GJAHR,BUZEI 都是BSEG表的KEY欄位.

4, 如果某些數據需要頻繁的從不同表提取, 使用視圖VIEW實現讀取緩存可以提高效率. 當視圖連接的是讀取次數較多, 但寫入不頻繁的表時(比如物料主數據表MARA), 可以使用視圖, 這樣比在程序裡面簡單用join要快,理論上join語句每次讀取的速度都是一樣的, 而視圖是從讀二次開始就快了,而且cache使得網路負載減低.

5, 使用SQL語句裡面的JOIN時候, 應該避免JOIN的表不要超過3個, 否則嚴重影響效率. 如果真的要JOIN表3個以上的話, 正確的方法不是用視圖VIEW, 而是使用SELECT ... INTO TABLE ... FOR ALL ENTRIES IN 以及 READ TABLE WITH KEY BINARY SEARCH.例如我們要提高讀取BSEG表的性能,首先我們會根據GJAHR主鍵從BKPF表取出部分數據到內表itab,然後使用FOR ALL ENTRIES IN itab WHERE BSEG~BELNR = itab~BELNR 這樣的的方法取得符合itab里所有條件的BSEG數據.注意使用FOR ALL ENTRIES要先CHECK作為條件的內表itab是否為空,還有作為WHERE的條件在這個內表裡面是否會有空值存在,否則無效.

6, 注意使用CORRESPONDING FIELDS OF 和 MOVE-CORRESPONDING 時候會進行欄位比較, 帶來CPU的開銷大.

7, 避免過得而頻繁的數據類型轉換,比如N轉換為C,但是從N轉換成STRING卻是很快的,因為操作STRING比CHAR類型少了比較長度的時間.

8, 使用二級索引提高DDIC的讀寫效率, 可以根據你的需要在SE11裡面創建INDEX, 並讓你程序里的SQL查詢語句里WHERE條件的順序與你的索引順序一致.

9, 二分查找比線性查找要高效,READ TABLE的之前使用SORT TABLE BY XXX 某個表關鍵欄位進行排序, 然後使用READ TABLE WITH KEY XXX = 'XXX' BINARY SEARCH. 這個就是所謂的二分查找法的應用.

10, 避免使用SQL語句動態查詢條件,動態表名和動態欄位名, 必要時候用宏或者子程序模塊代替.

11, 對於同一功能的函數和方法, 調用METHOD比調用FUNCTION要快.

12, SORTED TABLE可以使用二分查找法取得節點, 其時間復雜度是O(log N),但是插入節點會慢,因為要移動很多節點. 而HASHED TABLE則是基於哈希演算法的,其高效主要體現在把數據的存儲和查找時間大大降低,幾乎可以看成是常數時間O(1),而代價是消耗比較多的內存,然而在硬體技術越來越發達的今天,用空間換時間的做法在某種意義上是值得的。但是使用哈希表必須注意鍵值的唯一性!如果鍵值會出現重復的話, 不能使用哈希表,只能用排序表和標准表。

13, 使用APPEND LINES(或者INSERT LINES) OF ITAB1 TO ITAB2 比 LOOP AT ITAB1 INTO WA. APPEND(INSERT) WA TO ITAB2. ENDLOOP. 要高效.

14, 使用效率比較高的COLLECT, DELETE ADJACENT DUPLICATES FROM語句。

15, 使用高效的CONTEXT SQL語句.如以下代碼2比代碼1要快10倍以上!

代碼1:

SELECT * FROM SBOOK INTO SBOOK_WA UP TO 10 ROWS.
SELECT SINGLE AIRPFROM AIRPTO INTO (AP1, AP2)
FROM SPFLI
WHERE CARRID = SBOOK_WA-CARRID
AND CONNID = SBOOK_WA-CONNID.
SELECT SINGLE NAME INTO NAME1 FROM SAIRPORT
WHERE ID = AP1.
SELECT SINGLE NAME INTO NAME2 FROM SAIRPORT
WHERE ID = AP2.
ENDSELECT.

代碼2:

SELECT * FROM SBOOK INTO SBOOK_WA UP TO 10 ROWS.
SUPPLY CARRID = SBOOK_WA-CARRID
CONNID = SBOOK_WA-CONNID
TO CONTEXT TRAV1.
DEMAND AIRPFROM = AP1
AIRPTO = AP2
NAME_FROM = NAME1
NAME_TO = NAME2
FROM CONTEXT TRAV1.
ENDSELECT.

最後是注意內存的使用,以下是內存優化方面的例子:

1, 雖然ABAP擁有垃圾處理的機制, 但是這個是在程序運行完成後實現的. 所以我們盡量把無用的變數,內表,對象都釋放掉;

2, 盡量減少無用的靜態定義的變數,內表和對象, 因為靜態定義的對象會在編譯開始就佔有內存空間;

3, 盡量減少網路的傳輸負載, 比如在設計RFC遠程調用傳回的內表數據要盡量精簡, 數據量越大,對CPU和內存需求越多;

4, 內存使用緊張的情況下, 使用FREE語句, 以及SQL語句的PACKAGE SIZE n 選項.

SELECT vbeln erdat
FROM vbak
INTO TABLE li_vbak PACKAGE SIZE 50.

1、使用where語句
不推薦
Select* from zflight.
Check : zflight-airln = 『LF』 and zflight-fligh = 『BW222』.
Endselect.
推薦
Select* from zflight where airln = 『LF』 and fligh = 『222』.
Endselect.

2、使用聚合函數
不推薦
Maxnu = 0.
Select* from zflight where airln = 『LF』 and cntry = 『IN』.
Check zflight-fligh >maxnu.
Maxnu = zflight-fligh.
Endselect.
推薦
Select max( fligh ) from zflight intomaxnu where airln = 『LF』 and cntry = 『IN』.

3、使用視圖代替基本表查詢
不推薦
Select* from zcntry where cntry like 『IN%』.
Selectsingle * from zflight where cntry = zcntry-cntry and airln = 『LF』.
Endselect.
推薦
Select* from zcnfl where cntry like 『IN%』 and airln = 『LF』.
Endselect.

4、使用INTO table 代替select endselect
不推薦
Refresh: int_fligh.
Select* from zflight into int_fligh.
Append int_fligh. Clear int_fligh.
Endselect.
推薦
Refresh: int_fligh.
Select* from zflight into table int_fligh.

5、使用批量修改內表代替逐行修改
不推薦
Loop at int_fligh.
If int_fligh-flag is initial.
Int_fligh-flag = 『X』.
Endif.
Modify int_fligh.
Endloop.
推薦
Int_fligh-flag = 『X』.
Modify int_fligh transporting flag where flag is initial.
當使用不帶表頭的內表時,需要從工作區刪除,例如
MODIFY IT_TEST1 FROM WA_TEST1 TRANSPORTING BOX WHERE BOX IS INITIAL.

6、使用二分法查詢,提高查詢內表數據速度
不推薦
Read table int_fligh with key airln = 『LF』.
推薦
Read table int_fligh with key airln = 『LF』 binary search.

7、兩個內表添加使用批量增加代替逐行
不推薦
Loop at int_fligh1.
Append int_fligh1 to int_fligh2.
Endloop.
推薦
Append lines of int_fligh1 to int_fligh2.

8、使用table buffering
Use of buffered tables is recommended to improve the performance considerably. The buffer is bypassed while using the following statementsSelectdistinct
Select… for update
Order by, group by, having clause
Joins
Use the Bypass buffer addition to theselectclause in order to explicitly bypass the buffer whileselecting the data.

9、 使用FOR ALL Entries
不推薦
Loop at int_cntry.Selectsingle * from zfligh into int_flighwhere cntry = int_cntry-cntry.Append int_fligh.Endloop.
推薦
Select* from zfligh appending table int_fligh
For all entries in int_cntry
Where cntry = int_cntry-cntry.

10、正確地使用where語句,使查詢能使用索引When a base table has multiple indices, the where clause should be in the order of the index, either a primary or a secondary index
To choose an index, the optimizer checks the field names specified in the where clause and then uses an index that has the same order of the fields. One more tip is that if a table begins with MANDT, while an index does not, there is a high possibility that the optimizer might not use that index.

11、正確地使用MOVE語句
Instead of using the move-corresponding clause it is advisable to use the move statement instead. Attempt should be made to move entire internal table headers in a single shot, rather than moving the fields one by one.

12、正確地使用inner joinLet us take an example of 2 tables, zairln and zflight. The table zairln has the field airln, which is the airline code and the field lnnam, which is the name of the airline. The table zflight has the field airln, the airline code and other fields which hold the details of the flights that an airline operates.
Since these 2 tables a re logically joined by the airln field, it is advisable to use the inner join.
Selecta~airln a~lnnam b~fligh b~cntry into table int_airdet
From zairln as a inner join zflight as b on a~airln = b~airln.
In order to restrict the data as per theselection criteria, a where clause can be added to the above inner join.

13、使用sort by 代替order by

14、避免使用SELECTDISTINCT語句
使用的ABAPSORT + DELETE ADJACENT DUPLICATES 代替.

15、內標1批量插入內標2.

INSERT LINES OF ITAB1 [FROM N1] [TO N2] INTO [TABLE] ITAB2 [INDEX IDX].

該語句要求兩內表對象具有可以相互轉換的行結構。如果不指定行數,則整個內表ITAB1被插入ITAB2中。不指定行數時,ITAB1可以為任意內表,ITAB2必須為索引表,但是如果需要指定起始行N1和終止行N2中的任意一個,則兩個內表都必須是索引表。如果ITAB2前指定TABLE 附加項,則ITAB2可以是任意類型內表。使用該方式將一個內表插入到另個中的速度比用循環插入可以快20倍。

Ⅳ 求助~Abap native sql

因為abap在select 時,不能做欄位相加、減、乘、除運算ex. SELECT matnr, werks, lgort, (labst+insme+speme+retme+einme+umlme) FROM mard後來看到exec sql函數,就想測試看看...但我不清楚,對後端資料庫會不會造成影響。沒有人知道為什麼嗎?謝謝喔

Ⅵ ABAP的SQL問題,如何從資料庫選擇日期最近的記錄到內表中 具體

你可以定義一個內表IT_TAB, 然後內表裡面肯定有一個欄位DATE是關於日期的, 那麼這個日期是你需要的.

sort IT_TAB by DATE descending.
read IT_TAB index 1.

Ⅶ SAP ABAP測試程序開發SQL問題

好呀。。。

我測試了一下,我把代碼貼出來,以及結果。。。你看看。。再提出你想要的結果呢。

REPORTztest03.

DATA:BEGINOFw_wa,
idTYPEscustom-id,
nameTYPEscustom-name,
carridTYPEscarr-carrid,
carrnameTYPEscarr-carrname,
currcodeTYPEscarr-currcode,
urlTYPEscarr-url,
connidTYPEsbook-connid,
fldateTYPEsbook-fldate,
bookidTYPEsbook-bookid,
priceTYPEsflight-price,
currencyTYPEsflight-currency,
planetypeTYPEsflight-planetype,
ENDOFw_wa,
itabLIKETABLEOFw_wa.

DATAs_idTYPEscustom-idVALUE'00000003'.
DATAs_fldateTYPERANGEOFsflight-fldateWITHHEADERLINE.

s_fldate-low='19950101'.
s_fldate-high='20140312'.
s_fldate-option='BT'.
s_fldate-sign='I'.
APPENDs_fldate.


SELECT*
FROMscustom
INNERJOINsbookONscustom~mandt=sbook~mandtANDscustom~id=sbook~customid
INNERJOINsflightONsflight~mandt=sbook~mandtANDsflight~carrid=sbook~carridANDsflight~connid=sbook~connid
INNERJOINscarrONsflight~mandt=scarr~mandtANDsflight~carrid=scarr~carrid
WHEREscustom~idEQs_idANDsflight~fldateINs_fldate[].

BREAK-POINT.

Ⅷ SQL abap

請把游標移到select上,按F1看select的語法,看看哪些有哪些Key word可用。如樓上二位所言,有些內容在內表(Internal Table)中進行處理,看起來會簡潔些。

Ⅸ ABAP開發中如何進行,代碼執行效率優化

希望對你有幫助!!!因為這些我一個也不懂 啊 !!!!!啊...啊.... 啊啊...啊 .!!!為了幫你哦!!!!
。。。。。定義一個內表,然後按照內表中的欄位進行select into到內表中。例如:
data:begin of gt_data occurs 0,
matnr like mard-matnr,
werks like mard-werks,
lgort like mard-lgort,
labst like mard-labst,
end of gt_data.
上面的表示一個內表gt_data定義出來了。然後我們在把對應的數據提取出來,
select matnr
werks
lgort
labst
into table gt_data
from mard
where werks = '1100'.
這樣的話,數據就會按照物料號、工廠、庫存地點、非限制庫存 提取放到內表gt_data中了。
也可以寫成:
select *
into corresponding fields of table gt_data
from mard
where werks = '1100'.
上面的這兩種sql語句的區別在於: 第一種程序會只針對matnr werks lgort labst 這四個欄位去提取數據,第二種,程序會提取mard表中所有欄位,然後按照matnr werks lgort labst 來mapping上去。 相對效率而言,第一種效率好些。
至於程序優化上面,盡量減少對資料庫的訪問,盡量避開那幾個大表,比如 mseg ,bseg 等這類的表。 盡量把數據放在內存中計算, 別的倒也沒什麼了,其實在內表上關於一些sort table 和 hash table 來說,雖然在速度上會快一些(「比如在處理幾十萬條數據」),如果在幾萬到十幾萬條數據的話,性能上其實沒什麼太大的變化,但是在後期程序修改上,會比較的麻煩一點,一般這種內表我們只是運用在比較大的表上用。 OK。

Ⅹ 如何用abap實現操作外部SQL SERVER的數據

需要看你的系統支持直接讀SQL Server資料庫。
建議你用OLE的方式試試
DBCO的可能性不大,除非你的系統安裝在WINDOWS環境中