Académique Documents
Professionnel Documents
Culture Documents
Agenda
Analyzing Tools
Case Study
Analyzing Tools
Analyzing transaction steps SQL performance trace ABAP runtime analysis Performance Optimization Examples in SAP system
Network
Dispatcher Queue
1 2 3 4
R/3 work process
User context
Dispatcher
13
Application server
Roll buffer
12
...
R/3 database interface
5 11
10
Database server
9 7 8
Analyzing Tools
Analyzing transaction steps SQL performance trace ABAP runtime analysis Performance Optimization Examples in SAP system
SELECT <field list> FROM vvbak WHERE ... SQL Trace File R/3 database interface R/3 table buffering
Database files
SAP AG 2005, SAP Customer Program Optimization / 9
Database process
Database buffer
Database Interface
PREPARE in trace Database server DB SQL cache SELECT mandt ... FROM VVBAK WHERE vbeln = :A1 DB cursor cache A1 Data buffer OPEN in trace FETCH in trace REOPEN in trace FETCH in trace
Data records
Last statistics date Analyze Method Number Explain with hint... Optimizer Trace Analyze... of rows SQL Statement Number of blocks allocated Number of empty blocks SELECT Average space Chain count "VBELN" , "AUART" FROM Average row length "VVBAK" WHERE UNIQUE Index VVBAK~0 "MANDT" = :A0 AND "VBELN" BETWEEN :A1 AND :A2
Column Name Execution Plan MANDT VBELN SELECT STATEMENT ( Estimated Costs = 3 , Estimated #Rows = 3 ) Index Statistics Analyze... TABLE ACCESS BY INDEX ROWID INDEX RANGE SCAN VVBAK~0 VVBAK
#Distinct 1 1.000
1 2
SAP AG 2005, SAP Customer Program Optimization / 12
VVBAP REOPEN 0 0 SELECT WHERE "MANDT" = '100' AND "VBEL VVBAP FETCH 5 1403 VVBAP REOPEN 0 0 SELECT WHERE "MANDT" = '100' AND "VBEL ABAP-Editor: Display Program SAPBC490D_SQL_LOGICAL_VIEWS VVBAP FETCH 5 1403 VVBAP REOPEN 0 0 SELECT WHERE "MANDT" = '100' AND "VBEL VVBAP FETCH 5 1403 VVBAK REOPEN 0 0 Note marked line "MANDT" = '100' AND "VBEL SELECT WHERE VVBAK 10 1403 119 FETCH SELECT vbeln auart FROM vvbak VVBAP 0 SELECT WHERE "MANDT" = :A0 120 PREPARECORRESPONDING0 FIELDS OF TABLE g_itab_vvbakAND "VBELN" INTO VVBAP 0 0 SELECT WHERE "MANDT" = '100' AND "VBEL 121 OPEN WHERE vbeln IN g_vbeln. VVBAP 49 1403 122 FETCH VBAK_VBAP PREPARE 0 123 IF sy-subrc NE 0. 0 SELECT WHERE "MANDT" = :A0 AND the WHERE EXIT. ENDIF. " Necessary for "VBELN" VBAK_VBAP OPEN 0 0 SELECT WHERE "MANDT" = '100' AND "VBEL 124 VBAK_VBAP FETCH 49 1403 125 SELECT vbeln posnr matnr FROM vvbap VVBAK PREPARE 0 0 SELECT WHERE ( T_01 . "MANDT" = :A0 A 126 INTO CORRESPONDING FIELDS OF TABLE g_itab_vvbap VVBAK OPEN 0 0 SELECT WHERE ( T_01 . "MANDT" = '100' 127 FOR ALL ENTRIES IN g_itab_vvbak VVBAK FETCH 49 1403 128 WHERE vbeln = g_itab_vvbak-vbeln. VVBAK REOPEN 0 0 SELECT WHERE "MANDT" = '100' AND "VBEL Active 119 line SAP AG 2005, SAP Customer Program Optimization / 13
Identical selects System Help Continue Executions 4 2 2 2 2 2 2 2 2 2 2 2 Cancel Object name VVBAK VVBAP VVBAP VVBAP VVBAP VVBAP VVBAP VVBAP VVBAP VVBAP VVBAP VVBAP WHERE clause "MANDT" "MANDT" "MANDT" "MANDT" "MANDT" "MANDT" "MANDT" "MANDT" "MANDT" "MANDT" "MANDT" "MANDT" = = = = = = = = = = = = '100' '100' '100' '100' '100' '100' '100' '100' '100' '100' '100' '100' AND AND AND AND AND AND AND AND AND AND AND AND "VBELN" "VBELN" "VBELN" "VBELN" "VBELN" "VBELN" "VBELN" "VBELN" "VBELN" "VBELN" "VBELN" "VBELN" BETWEEN '000000000 = '0000000001' = '0000000002' = '0000000003' = '0000000004' = '0000000005' = '0000000006' = '0000000007' = '0000000008' = '0000000009' = '0000000010' = '0000000001' OR
Analyzing Tools
Analyzing transaction steps SQL performance trace ABAP runtime analysis Performance Optimization Examples in SAP system
The three phases of the ABAP runtime analysis: Local Trace File
Limiting the analysis Obtaining the run data Evaluating the results
Runtime analysis: Initial Screen Runtime analysis Edit Goto Utilities Settings System Help
Tips & Tricks Measurement Short description In the current user session Transaction Program Function module Execute Limit analysis Variant DEFAULT Standard variant
Full aggregation Full aggregation Program part X Program part X Statement Y Statement Y DO 1000 TIMES DO 1000 TIMES Program part Program part X Program part X Statement Y Statement Y ENDDO ENDDO
statements
Maximum size of file Maximum execution time Aggregation Full Per calling position None
1000 1800
KB Seconds
Aggregation per calling item Aggregation per calling item Program part X Program part X Statement Y Statement Y DO 1000 TIMES DO 1000 TIMES Program part X => 2 Entries Program part X => 2 Entries Statement Y => 2 Entries Statement Y => 2 Entries ENDDO ENDDO
No aggregation Program part X Statement Y DO 1000 TIMES Program part X Statement Y ENDDO
SAP AG 2005, SAP Customer Program Optimization / 19
Initial screen
Select data file Save data file locally Evaluate the data
ABAP DB R/3
Number
Gross
...
1 3
80,610 20,113
10
Gross
Net
11
Analyzing Tools
Analyzing transaction steps SQL performance trace ABAP runtime analysis Performance Optimization Examples in SAP system
12
13
14
Estimated costs
Table and index statistics SELECT STATEMENT TABLE ACCESS FULL Cost-based database optimizer VVBAK
... 4533 2
... ROWID MAND T VBELN POSNR MATN R ... 001 0000 001 22 0013 0012 34 ...
... 4587 6
...
VBELN POSNR MATN R ... 002 0000 965 8 0012 0001 23 ...
...
Data buffer
DB SQL Cache
SQL statements with access strategy
...
SAP AG 2005, SAP Customer Program Optimization / 30
15
Many blocks
MANDT VBELN 001 001 001 001 001 001 001 001 001 002 002 002 002 000013245 000013246 000013247 000013248 000013249 000013250 000113245 000113251 000113252 000013249 000013250 000013251 000013252
OBJNR 654875454 697935435 673225747 216356543 687535435 258674802 983231365 522112486 325348654 241567685 968351332 874352321 544546546
ERNAM ERNIE FRED JAMES GUS ERNIE KURT MAX BERT BERT HUGO FRED MAX GUS
Search range (area of table that needs to be searched for required records)
16
001 001 001 001 001 001 001 001 001 002 002 002 002
000013245 000013246 000013247 000013248 000013249 000013250 000113245 000113251 000113252 000013249 000013250 000013251 000013252
Search range (area of table that needs to be searched for required records)
MANDT VBELN 001 001 001 001 001 001 001 001 001 002 002 002 002 000013245 000013246 000013247 000013248 000013249 000013250 000113245 000113251 000113252 000013249 000013250 000013251 000013252
OBJNR 654875454 697935435 673225747 216356543 687535435 258674802 983231365 522112486 325348654 241567685 968351332 874352321 544546546
ERNAM ERNIE FRED JAMES GUSS ERNIE KURT MAX BERT BERT HUGO FRED MAX GUSS
FETCH
FETCH FETCH
:
FETCH
17
18
19
20
21
22
23
24
25
26
DBMS
T1.K1 T1.F1 T1.F2 T2.F3 T2.F4 T1.K1 T1.F1 T1.F2 T2.F3 T2.F4 T1.K1 T1.F1 T1.F2 T2.F3 T2.F4 T1.K1 T1.F1 T1.F2 T2.F3 T2.F4 T1.K1 T1.F1 T1.F2 T2.F3 T2.F4
Resulting set
Database
T1 K1 F1 F2
T2 K1 F3 F4
SELECT t1~vbeln t2~vbobj INTO ... FROM vvbak AS t1 INNER JOIN vvbuk AS t2 ON t1~vbeln = t2~vbeln WHERE t1~objnr = '0000777'.
Nested loop
MANDT 001 001 001 001 001 001 ... VBELN 0000120 0000121 0000122 0000123 0000124 0000125 OBJNR ... 0000110 0000110 0000777 0000777 0000777 001 ... 0000123 ... MANDT VBELN 001 0000121 001 0000122 ... ... ...
VVBAK
VVBUK
27
Nested Loop
The top input to the nested loop is the outer table The bottom input to the nested loop is the inner table For each outer row, searches for matching rows are in the inner input table Effective if the outer input is very small and the inner input is preindexed and very large Optimizer sometimes sorts the outer input to improve locality of the searches on the index over the inner input Best when search uses an index (indexes on join columns are used) Low memory requirement
SAP AG 2005, SAP Customer Program Optimization / 55
28
VVBAP
Selection and merging of table records
SAP AG 2005, SAP Customer Program Optimization / 58
VVBAK
29
30
Nested loop
Decide which tables to use for access Access to next innermost table using JOIN condition
31
SELECT bukrs belnr gjahr specific index fields: MANDT, BELNR FROM bkkpf => gap in index search string INTO TABLE g_itab_bkkpf WHERE belnr = 0000000100. Index search string: 001____0000000100
32
SELECT vbeln bstnk kunnr FROM vvbak INTO TABLE g_itab_vvbak specific index fields: MANDT, WHERE kunnr = '0000000050' KUNNR and FAKSK => ineffective AND NOT faksk = '00'. use of indexes
Negative formulation
SELECT vbeln bstnk kunnr FROM vvbak INTO TABLE g_itab_vvbak specific index fields: MANDT, WHERE kunnr = '0000000050' KUNNR and FAKSK => effective use AND faksk IN ('01','02','03', IN of indexes '04','05','08','09').
Positive formulation
SAP AG 2005, SAP Customer Program Optimization / 66
33
SELECT vbeln erdat erzet FROM vvbak INTO TABLE g_itab_vvbak WHERE vbeln BETWEEN '0000000001' AND '0000000005'.
BETWEEN operator
SELECT vbeln erdat erzet FROM vvbak INTO TABLE g_itab_vvbak WHERE vbeln IN ('0000000001', '0000000002', '0000000003', '0000000004', '0000000005').
IN operator
Replace WHERE field LIKE value with WHERE field = value
SAP AG 2005, SAP Customer Program Optimization / 67
34
35
36
Database Column MANDT VBELN ERDAT ERZET ERNAM ANGDT BNDDT Data type VARCHAR2 VARCHAR2 VARCHAR2 VARCHAR2 VARCHAR2 VARCHAR2 VARCHAR2 Last analyzed* 30.09.1999 30.09.1999 30.09.1999 30.09.1999 30.09.1999 30.09.1999 30.09.1999 Sample size* 220,780 220,780 220,780 220,780 220,780 220,780 220,780 Distinct values* 1 220,780 856 187,023 73 435 267
37
Distinct values
1 - 10
11 - 100
101 - 1.000
10.001 - 100.000
100.001 - 1.000.000
Number of areas that are specified by generic key and contain the given ... 4,506 7,172 9,195 16,607 3,234 5,715 7,195 16,587 1,011 1,072 1,487 1,536 210 333 457 428 0 5 8 8 2 1 0 0
VERSN
Distinct values
1 - 10
11 - 100
101 - 1,000
10,001 - 100,000
100,001 - 1,000,000
Number of areas that are specified by generic key and contain the given ... 4,506 7,172 9,195 16,607 3,234 5,715 7,195 16,587 1,011 1,072 1,487 1,536 210 333 457 428 0 5 8 8 2 1 0 0
VERSN
38
Change index design Reset DB SQL cache Perform object-related DB SQL cache analysis after changing index design
DB SQL cache => restrict to tables and views Retain all SQL statements with access strategy, where the tables or views are affected
SAP AG 2005, SAP Customer Program Optimization / 77
Used in Environment System Help Programs Screens Logical databases Function module interfaces Domains Structures DB tables Table types Views Entity types Lock objects Search helps Classes (definition) Classes (implementation) Create Interfaces Test cases
Database table View Data type Domain Search help Lock object Display
VVBAK
Change
In background
Search area
39
SELECT STATEMENT TABLE ACESS BY INDEX ROWID INDEX RANGE SCAN VVBAK
VVBAK ~ 0
40
SELECT vbeln erdat kunnr FROM vvbak INTO g_wa_vvbak. CHECK g_wa_vvbak-vbeln GE g_low CHECK AND g_wa_vvbak-vbeln LE g_high. APPEND g_wa_vvbak TO g_itab_vvbak. ENDSELECT.
CHECK condition
SELECT vbeln erdat kunnr FROM vvbak INTO g_wa_vvbak WHERE vbeln BETWEEN g_low AND g_high. WHERE APPEND g_wa_vvbak TO g_itab_vvbak. ENDSELECT.
WHERE condition
SAP AG 2005, SAP Customer Program Optimization / 82
41
42
DESCRIBE TABLE g_itab_vvbak LINES lines. IF lines EQ 0. Check whether driver table is empty MESSAGE I051(bc490). EXIT. ENDIF. SORT g_itab_vvbak BY kunnr. DELETE ADJACENT DUPLICATES FROM g_itab_vvbak. SELECT kunnr adrnr FROM kkna1 INTO TABLE g_itab_kkna1 FOR ALL ENTRIES IN g_itab_vvbak WHERE kunnr = g_itab_vvbak-kunnr.
Eliminate duplicates
...
...
SELECT STATEMENT
INDEX UNIQUE SCAN KKNA1~0 TABLE ACESS BY INDEX ROWID INDEX UNIQUE SCAN
SAP AG 2005, SAP Customer Program Optimization / 86
KKNA1
KKNA1~0
43
RANGES Tables
SELECT mandt vbeln erdat erzet FROM vvbak INTO TABLE g_itab_vvbak WHERE vbeln IN g_itab_vbeln. IN
INDEX UNIQUE SCAN VVBAK~0 TABLE ACESS BY INDEX ROWID INDEX UNIQUE SCAN
SAP AG 2005, SAP Customer Program Optimization / 87
VVBAK
VVBAK~0
Aggregate Functions
SELECT vbeln zmeng matnr FROM vvbap INTO TABLE g_itab_vvbap WHERE vbeln IN g_vbeln. LOOP AT g_itab_vvbap. * Compute maximum of zmeng and minimum of matnr ... ENDLOOP.
44
HAVING Clause
Array Fetch
45
Up to N rows
46
47
MANDT
VVBAP
VVBAK
VBELN
0000000001 0000000002 0000000003
...
...
...
INNER JOIN
MANDT VBELN 400 400 400 400 ... POSNR 0000000001 0001 0000000001 0002 0000000003 0001 0000000003 0002 ... 400 400 400 400 ... 400 ...
Implementation in ABAP
48
Nested SELECTs
SELECT SELECT vbeln kunnr FROM vvbak INTO (g_wa_vvbak_kkna1-vbeln, g_wa_vvbak_kkna1-kunnr) WHERE vbeln IN g_vbeln. SELECT SINGLE adrnr FROM kkna1 SELECT INTO g_wa_vvbak_kkna1-adrnr WHERE kunnr EQ g_wa_vvbak_kkna1-kunnr. IF sy-subrc EQ 0. APPEND g_wa_vvbak_kkna1 TO g_itab_vvbak_kkna1. ENDIF. ENDSELECT ENDSELECT.
Object SELECT STATEMENT (Estimated Costs = .... VVBAK~0 ) VVBAK VVBAK KKNA1 KKNA1 KKNA1 SELECT STATEMENT (Estimated Costs = .... KKNA1~0 ) KKNA1 KKNA1 KKNA1 Oper REOPEN FETCH REOPEN FETCH REOPEN FETCH REOPEN FETCH Rec 0 1000 0 1 0 1 0 1
...
SAP AG 2005, SAP Customer Program Optimization / 97
...
...
Identical SELECTs
Data records from inner table are re-read unnecessarily
49
Database optimizer determines order of access Access to outer table should be as selective as possible (selective WHERE conditions) For each data record in the outer table, as few records as possible should exist in the inner table (selective JOIN conditions) An index for the JOIN conditions should exist on the inner table (at least)
Database View
SELECT vbeln kunnr adrnr FROM vbak_kna1 INTO TABLE g_itab_vvbak_kkna1 WHERE vbeln IN g_vbeln.
SELECT STATEMENT
NESTED LOOPS TABLE ACESS BY INDEX ROWID INDEX RANGE SCAN VVBAK
VVBAK~0 KKNA1
KKNA1~0
50
NESTED LOOPS TABLE ACESS BY INDEX ROWID INDEX RANGE SCAN VVBAK
VVBAK~0 KKNA1
KKNA1~0
VVBAK
KKNA1
SAP AG 2005, SAP Customer Program Optimization / 101
DESCRIBE TABLE g_itab_vvbak LINES g_lines. ... SORT g_itab_kkna1 BY kunnr. DELETE ADJACENT DUPLICATES FROM g_itab_kkna1.
CONCATENATION TABLE ACCESS BY INDEX ROWID INDEX UNIQUE SCAN KKNA1~0 KKNA1 KKNA1
SELECT kunnr adrnr INDEX UNIQUE SCAN FROM kkna1 INTO (g_wa_kkna1-kunnr, g_wa_kkna1-adrnr) FOR ALL ENTRIES IN g_itab_kkna1 WHERE kunnr = g_itab_kkna1-kunnr. MODIFY g_itab_kkna1 FROM g_wa_kkna1 INDEX sy-dbcnt. ENDSELECT. LOOP AT g_itab_vvbak INTO g_wa_vvbak. ... ENDLOOP.
SAP AG 2005, SAP Customer Program Optimization / 102
51
Subquery
... SELECT kunnr adrnr INTO TABLE g_itab_vvbak_kkna1 FROM kkna1 WHERE kunnr IN ( SELECT DISTINCT kunnr FROM vvbak ( WHERE WHERE vbeln IN g_vbeln ) ). ...
SELECT STATEMENT (Estimated Costs = .... ) NESTED LOOPS ... TABLE ACCESS BY INDEX ROWID INDEX RANGE SCAN TABLE ACCESS BY INDEX ROWID INDEX UNIQUE SCAN KKNA1~0 VVBAK
VVBAK~0
KKNA1
SELECT STATEMENT
MANDT VBELN 001 001 001 001 001 001 001 001 ... 0000120 0000121 0000122 0000123 0000124 0000125 0000126 0000127 KUNNR ... 0000100 0000100 0000101 0000101 0000102 0000103 0000103 0000104
NESTED LOOPS OUTER TABLE ACESS BY INDEX ROWID INDEX RANGE SCAN VVBAK~0 KKNA1 VVBAK
KKNA1~0
VVBAK
KKNA1
SAP AG 2005, SAP Customer Program Optimization / 104
52
Logical view Transparent tables TAB_B Cluster tables CLUST_A CLUST_B CLUST_C Pooled tables POOL_A POOL_B
Physical view
Database tables
53
Cluster Tables
Cluster table TABA A B C D TIMESTAMP Table cluster TABAB Key fields PAGELG
A A
B B
0 1
C G
D H
E I
F J
Key fields
SAP AG 2005, SAP Customer Program Optimization / 107
Pooled Tables
TABA TABB
A E
C F
D G H I
TABNAME VARKEY
VARDATA
Key
SAP AG 2005, SAP Customer Program Optimization / 108
54
Disadvantages
Limitations on database functionalities
No views or ABAP JOINs No secondary indexes No GROUP BY, ORDER BY, ...
Fewer tables and table fields Fewer different SQL statements Less load on database dictionary and database buffer Simpler administration For cluster tables
Fewer database accesses
SELECT bukrs belnr gjahr kunnr FROM bseg INTO TABLE g_itab_bsid WHERE bukrs = 0001 AND belnr = 0000000022.
55
SELECT bukrs belnr ... FROM bseg bseg INTO TABLE g_itab_bsid WHERE kunnr = '0000000100'.
SELECT MANDT, BUKRS, .. RFBLG FROM RFBLG WHERE MANDT = :A0 ORDER BY MANDT, BUKRS, ...
Unselective access
SELECT bukrs belnr FROM bsid INTO TABLE g_itab_bsid WHERE kunnr = '0000000100'. SELECT BUKRS, MANDT, .. FROM BSID WHERE MANDT = :A0 KUNNR AND KUNNR = :A1.
Selective access
SAP AG 2005, SAP Customer Program Optimization / 111
56
SELECT kappl kschl vkorg .. FROM aa005 INTO TABLE g_itab_aa005 WHERE matnr = matnr 000000000000000027.
SELECT TABNAME, VARKEY .. FROM KAPOL KAPOL WHERE TABNAME = :A0 AND TABNAME VARKEY VARKEY LIKE :A1 ORDER BY TABNAME , ..
Unselective access
AA005 fully buffered on application server <=> Repeated database read is not necessary Remove AA05 from table pool KAPOL and create index for MATNR <=> Efficient data read is possible
Selective access
SAP AG 2005, SAP Customer Program Optimization / 113
57
...
SAP GUI
...
SAP GUI SAP GUI
...
...
SAP GUI
Application server B
Table buffer
Program buffer R/3 buffer Dictionary buffer Number range buffer Roll and paging buffers
...
Network
DBMS processes
Database buffer
Database
Application server A
ABAP program
0.2 - 6 ms
Database interface
Table buffer
8 - 600 ms
Network
DBMS
DBMS processes
Database buffer
Database
58
Types of Buffering
Single-record buffering
key1 key2
A A B B B A A A A B B B C C D A A A B B C C C C D D D D
key3
2 4 1 3 5 1 3 6 8 1 2 3 0 3 5 2 3 6 2 4 2 3 5 8 1 2 3 4
data
key3
data
key1
001 001 001 001 002 002 002 002 002 002 003 003 003 003 003 003 003 003
key2
key3
data
key1
key2
key3
data
001 001 001 001 002 002 002 002 002 002 002 002 003 003 003 003 003 003 003 003 003 003 003
001 001 001 001 001 002 002 002 002 002 002 002 002 002 002 003 003 003 003 003 003 003 003 003 003 003 003 003
Buffer Synchronization
Buffer synchronization every 1 - 2 minutes
Application server A UPDATE TCURR... Table buffer DB interface Application server B
...
DB interface DB interface
Table buffer
1
INSERT DDLOG Network
3
SELECT DDLOG
2
DDLOG
Database
59
Degree of Invalidation
60
=> Database
SELECT * FROM tcurr CLIENT SPECIFIED CLIENT SPECIFIED INTO TABLE g_itab_tcurr WHERE kurst = 'EURO'.
=>Table buffer
SELECT * FROM tcurr INTO TABLE g_itab_tcurr WHERE kurst = 'EURO'.
Generic buffering
=> Database
SELECT * FROM t100 INTO TABLE g_itab_t100 WHERE sprsl = 'D' AND arbgb = 'BC490' AND msgnr = '050'.
=>Table buffer
SELECT SINGLE * FROM t100 INTO g_wa_t100 WHERE sprsl = 'D' AND arbgb = 'BC490' AND msgnr = '050'.
Technical criteria
Small, usually < 1 MB Often read, but seldom changed Temporary data inconsistency acceptable Access mainly from key fields
Note:
Buffer tables > 10 MB in exceptional cases only Table buffers cannot be accessed via secondary indexes Check available memory space before buffering more tables
61
62
Table Types
ANY TABLE INDEX TABLE STANDARD TABLE HASHED TABLE
SORTED TABLE
Key access
Table scan
Binary search
Hash function
increase linearly
O(n)
n
mainly index mainly key UNIQUE | NON-UNIQUE only key UNIQUE
Uniqueness
NON-UNIQUE
63
64
Time in microseconds
1E
+0 5
1E
10
10
10
00
10
00
10
20
40
80
160
320
640
1280
Hashed Tables
...
AT NEW wa_vbap-vbeln. READ TABLE hash_vbak INTO wa_vbak WITH TABLE KEY READ TABLE mandt = sy-mandt vbeln = wa_vbap-vbeln. WRITE: / wa_vbak-vbeln, wa_vbak-erdat. ENDAT. WRITE: /10 wa_vbap-posnr, ... . ENDLOOP.
65
Sorted Tables
LOOP AT sort_vbpa INTO wa_vbpa WHERE mandt = sy-mandt AND parvw = 'WE'. ENDLOOP.
LOOP AT sort_vbpa INTO wa_vbpa WHERE mandt = sy-mandt AND vbeln = '0000000900'. ENDLOOP. DELETE TABLE sort_vbpa WHERE mandt = sy-mandt AND vbeln = '0000000900'.
Standard Tables
Flexible access
for example, using various keys
PARAMETERS:
SORT SORT stan_vbak BY ernam. READ TABLE stan_vbak WITH KEY ernam = p_ernam INTO wa READ BINARY SEARCH. IF sy-subrc NE 0. ... ENDIF. SORT stan_vbak BY erdat vdatu. SORT LOOP LOOP AT stan_vbak INTO wa WHERE erdat = sy-datu AND vdatu = p_vdatu. IF wa-erdat NE sy-datu OR wa-vdatu NE p_vdatu. EXIT. ENDIF. ENDLOOP.
SAP AG 2005, SAP Customer Program Optimization / 132
66
Array Fetch
67
68
69
70
71
...
READ TABLE ... FROM <WA>. READ TABLE ... WITH TABLE KEY ... WITH TABLE KEY ...
If you can fully specify the primary key, use FROM or WITH TABLE KEY
i_vbak
mandt 400 400 400 400 400 vbeln 0000000100 0000000110 0000000120 0000000130 0000001000
wa-mandt = sy-mandt. wa-vbeln = 0000000110'. READ TABLE i_vbak FROM wa INTO wa. * or READ TABLE i_vbak WITH TABLE KEY mandt = sy-mandt vbeln = 0000000110 INTO wa.
READ TABLE i_vbak WITH KEY mandt = sy-mandt vbeln = 0000000110 INTO wa.
* for standard tables: SORT i_vbak BY mandt vbeln. READ TABLE i_vbak INTO wa WITH KEY mandt = sy-mandt vbeln = 0000000110 BINARY SEARCH BINARY SEARCH .
72
LOOP AT <itab> ... LOOP AT MODIFY MODIFY <itab> ... DELETE DELETE <itab> ...
SELECT-OPTIONS: s_vbeln FOR vbak-vbeln. LOOP AT stan_vbap INTO wa. IF wa-vbeln IN s_vbeln. * ... ENDIF. ENDLOOP.
Sort_vbak 1 2
Sort_vbak
1 2 3 4 5
index 1 2
1 2 3 4 .. 10
index = 1. LOOP AT sort_vbak ASSIGNING <fs_vbak>. LOOP AT sort_vbap ASSIGNING <fs_vbap> FROM index. FROM index. IF <fs_vbap>-vbeln NE <fs_vbak>-vbeln. index = sy-tabix. index EXIT. ENDIF. ENDLOOP. ENDLOOP.
...
73