[SAP ABAP開發技術總結]ABAP調優——Open SQL優化

 

11.1.     數據庫編程方面優化

1.   不要使用 SELECT * ...,選擇須要的字段, SELECT * 既浪費CPU,又浪費網絡帶寬資源,還需佔用大量的ABAP內存數據庫

2.   不要使用SELECT DISTINCT ...會繞過緩存,可以使用 SORT BY + DELETE ADJACENT DUPLICATES 代替express

3.   少用相關子查詢,由於子查詢對外層查詢結果集中的每條記錄都會執行一次編程

4.   少用嵌套SELECT … ENDSELECT,可使用聯合查詢或FOR ALL ENTRIES來替換,減小循環次數緩存

5.   若是肯定只查一條數據時,使用 SELECT SINGLE... 或者是 SELECT ...UP TO 1 ROWS ...服務器

6.   統計時,直接使用SQL聚合函數,而不是將數據讀取出來後在程序裏再進行統計網絡

7.   使用遊標讀取數據,這樣省掉了將從數據庫中的取記錄放入內表的INTO語句這一過程開銷函數

8.   多使用inner join,必要時才使用left join性能

9.   inner join條件放置的位置應該按照 OnWhereHaving的順序放,由於SQL條件的的執行通常是按這個順序來執行的,將條件放在最開始執行,則可過濾掉大部數據;但要注意Left Outer Join,是否能夠將ON中的條件移動到Where從句則要考慮(若是真能放在Where從句中,則應該使用Inner Join,而非Left Outer Join,由於Where條件會過濾掉哪些包括在右表中不存在的左表數據),由於此時條件放在On後面與放在Where語句後面結果是不同的(由於無論on中的條件是否爲真,左表中在右邊表不存在的數據也會被返回,但如放在where條件中,則會對On產生的數據再次過濾的條件,會濾掉不知足條件的記錄——包括左表在右表中找不到的記錄,這時已經沒有left join的含義)優化

10.  要根據主鍵或索引字段查找數據,且WHERE從句中的條件字段需按INDEX字段順序書寫,且將索引字段條件靠前(左邊),如:在VBFA表中查找SO所對應的交貨單DN,由於若是直接到LIPS中找時,SO的訂單中號與行號在LIPS中非主鍵,但在VBFA是部分主鍵VBFA中根據部分主鍵查找 SO -> DN; 根據索引查找 SO -> PO,VBFA-VBELN+VBFA-POSNN組合字段上建立了索引,即根據SOPO時,不要從EKKN關聯表中查找,而是經過VBFA中查找後來查看EKKN,發如今VBELN+VBELP字段上建立了索引,因此從VBFAEKKO查找應該差很少,主要看哪一個表數據量少的問題了spa

檢查條件組合字段是不是主鍵,或者是上在上面建立了索引,避免條件組合字段即不是主鍵又沒有索引

11.使用部分索引字段問題:若是一個索引是由多個字段組成的,只使用一部分關鍵字段來進行查詢時,也是可使用到索引,但使用時要注意要按照索引定義的順序且取其前面部分

12.  根據索引字段進行ORDER BY,不然經過程序進行SORT BY。與其在數據庫在經過非索引字段進行排序,不如在程序中使用SORT BY語句進行排序,由於此狀況下應用服務器上的執行速度要比數據庫服務器快(應用服務器上採用的是內存排序)

13.避免在索引字段上使用:

l  not<>!=IS NULLIS NOT NULL

l  避免使用 LIKE,但LIKE '銷售組1000'LIKE '銷售組1000%'能夠用到,而LIKE '%銷售組1000'(百分號前置)則用不到索引

l  不要使用OR來鏈接多個索引字段;對於同一索引字段,可使用IN來替代OR

image094[4]
image095[4]

14.避免使用如下語句,由於使用這些語句時,不能使用 Table Buffer

l  Aggregate expressions

l  Select distinct

l  Select …for update

l  Order bygroup byhaving從句

l  Joins,使用JOIN時,會繞過SAP緩存,可使用FOR ALL ENTRIES來代替

l  WHERE從句中使用Sub queries(子查詢)

l  WHERE從句中使用IS NULL條件

15.在下面狀況下使用FOR ALL ENTRIES IN:

l  在循環內表 LOOP...AT Itab中循環訪問數據庫

l  簇表是禁止JOIN的表類型, 當須要聯接簇表查詢數據時,如:BSEG(會計憑證)、KONV(條件表)

簇表通常是由多個表組成,簇表中的數據來自於多個表,有點像視圖,但不能直接經過簇表進行數據維護

l  JOIN超過3個表會出現性能問題, 當使用JOIN聯接的表超過3個時

l  若是兩個表的數據很是大時(上百萬),使用JOIN進行聯合查詢會很慢,此時改用FOR ALL ENTRIES IN

16.使用內表批量操做數據庫,而不要使用工做區一條條操做,如:

SELECT ... INTO TABLE itab
INSERT dbtab FROM TABLE itab
DELETE
dbtab FROM TABLE itab
UPDATE/MODIFY
dbtab FROM TABLE itab

17.若是你使用 CLIENT SPECIFIED,需在WHERE從句第一個位置上指明 MANDT條件,不然使用不到索引

相關文章
相關標籤/搜索