DB Programming With ABAP
DB Programming With ABAP
with ABAP
Page 1
Contents
Performance Tools
Page 2
Contents
Performance Tools
Page 3
Performance of Business Transactions
General rule:
The performance of a business transaction is primarily
determined by its DB accesses.
DB
Application
GUI
Page 4
R/3 Architecture
DB Server
local
User
WP data
communication
Application Server(s)
Page 5
RDBMS Architecture
App Server Table Buffer
memory
consumption App Server
CPU consumption
R/3 work process R/3 work process R/3 work process
LAN
communication
DB CPU
consumption
DB memory
consumption Database
Database cache Service
processes
Physical I/O
Operating system
Database files
ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 6
Page 6
Tables and Indices
Primary Key
spfli
mandt carrid connid ... cityfrom airpfrom ... cityto airpto ...
Primary index
•implicitly defined
•unique
cityfrom cityto
Secondary indices
•user defined
•unique or non-unique
airpfrom airpto
Page 7
Organization of Indices
Block 2 C
3 Record 5 B
4 D
5 E
5 Record 1 E
7 G
Record 6
Block 3
Record 7 F
6
G
7
Record 3
Page 8
Statement Optimizer
rule-based
Execution Plan
cost-based
Page 9
Array Operations: Data Transfer
SELECT
SELECT ** FROM
FROM sflight
sflight
INTO
INTO xflight.
xflight.
WHERE DB work process
R/3 work process WHERE carrid
carrid == ´LH
´LH ´.
´.
...
...
ENDSELECT.
ENDSELECT.
Local Data
Solution Set
Page 10
Table Buffering: Types
Page 11
Table Buffering: Invalidation
• Full Buffering
Any change invalidates the entire buffer
• Generic Buffering
Changes invalidate the corresponding generic areas of
the buffer
• Single-Record Buffering
If there is a change in only a single row, only this row is
invalidated. Other changes invalidate the entire buffer.
Page 12
Contents
Performance Tools
Page 13
Inner Join
INNER JOIN
Page 14
Left Outer Join
Page 15
Contents
Performance Tools
Page 16
SQL Trace
1. Start ST05
2. To switch on the SQL trace, choose Trace on
2. 3. Run the test program (in a different window)
4. Choose Trace off
5. To get a list of all SQL just recorded, choose
Trace list
3.
4.
5.
Page 17
SQL Trace
Page 18
Execution Plan
Page 19
Contents
Performance Tools
Page 20
SELECT field1 field2 field3 field4
FROM (table1 INNER JOIN table2 ON table1~field1 = table2~field1)
WHERE field1 IN ('A','B','C') AND field3 LIKE 'T%'
Solution set
Hit list
SELECT
clause
WHERE clause
Data to be searched -
Search area only limited by index access
FROM clause
Page 21
Rule 1: Keep the Hit List Small
Rule 1:
Keep the hit list small
Page 22
Keep the Hit List Small
SELECT
SELECT ** FROM
FROM sflight
sflight
INTO xflight
INTO xflight
WHERE
WHERE carrid
carrid == ´LH
´LH ’’ AND
AND
connid
connid = ´0300’ AND
= ´0300’ AND
fldate
fldate LIKE
LIKE ´1998%´.
´1998%´.
WRITE: / xflight-fldate.
WRITE: / xflight-fldate.
ENDSELECT.
ENDSELECT.
Page 23
Keep the Hit List Small
SELECT
SELECT ** FROM
FROM sflight
sflight
INTO xflight
INTO xflight
WHERE
WHERE carrid
carrid == ´LH
´LH ´´ AND
AND connid
connid == ´0300´.
´0300´.
CHECK
CHECK xflight-fldate(4)
xflight-fldate(4) == ´1999´.
´1999´.
WRITE:
WRITE: // xflight-fldate.
xflight-fldate.
ENDSELECT.
ENDSELECT.
SELECT
SELECT ** FROM
FROM sflight
sflight
INTO xflight
INTO xflight
WHERE
WHERE cariid
cariid == ´LH
´LH ’’ AND
AND
connid
connid = ´0300’ AND
= ´0300’ AND
fldate
fldate LIKE
LIKE ´1998%´.
´1998%´.
WRITE: / xflight-fldate.
WRITE: / xflight-fldate.
ENDSELECT.
ENDSELECT.
Page 24
Effects of Rule 1
App Server Table Buffer
memory
consumption App Server
CPU consumption
R/3 work process R/3 work process R/3 work process
LAN
communication
DB CPU
consumption
DB memory
consumption Database
Database cache Service
processes
Physical I/O
Operating system
Database files
ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 25
Page 25
Rule 2: Minimize the Amount of Transferred Data
Rule 2:
Minimize the amount of data transferred
between the database and the application
server
Page 26
Minimize the Amount of Transferred Data
SELECT
SELECT ** FROM
FROM sflight
sflight
INTO xflight
INTO xflight
WHERE
WHERE carrid
carrid == ´LH
´LH ’’ AND
AND
connid
connid = ´0300’ AND
= ´0300’ AND
fldate
fldate LIKE
LIKE ´1998%´.
´1998%´.
WRITE: / xflight-fldate.
WRITE: / xflight-fldate.
ENDSELECT.
ENDSELECT.
SELECT
SELECT fldate
fldate FROM
FROM sflight
sflight
INTO xflight
INTO xflight
WHERE
WHERE carrid
carrid == ´LH
´LH ’’ AND
AND
connid
connid == ´0300’
´0300’ AND
AND
fldate
fldate LIKE
LIKE ´1998%´.
´1998%´.
WRITE: / xflight-fldate.
WRITE: / xflight-fldate.
ENDSELECT.
ENDSELECT.
Page 27
Minimize the Amount of Transferred Data
sum
sum == 0.
0.
SELECT
SELECT seatsocc
seatsocc
FROM
FROM sflight
sflight INTO
INTO xseatsocc
xseatsocc
WHERE
WHERE fldate LIKE ´1999%´.
fldate LIKE ´1999%´.
sum
sum == sum
sum ++ seatsocc.
seatsocc.
ENDSELECT.
ENDSELECT.
WRITE:
WRITE: // sum.
sum.
SELECT
SELECT SUM(
SUM( seatsocc
seatsocc ))
FROM
FROM sflight INTO
sflight INTO sum
sum
WHERE
WHERE fldate LIKE ´1999%´.
fldate LIKE ´1999%´.
WRITE:
WRITE: // sum.
sum.
Page 28
Minimize the Amount of Transferred Data
SELECT
SELECT id
id name
name discount
discount
FROM
FROM scustom INTO
scustom INTO (xid,
(xid, xname,
xname, xdiscount)
xdiscount)
WHERE custtype = ´B´
WHERE custtype = ´B´
ORDER
ORDER BY
BY discount.
discount.
IF
IF sy-dbcnt >> 10.
sy-dbcnt 10. EXIT.
EXIT. ENDIF.
ENDIF.
WRITE:
WRITE: // xid,
xid, xname,
xname, xdiscount.
xdiscount.
ENDSELECT.
ENDSELECT.
SELECT
SELECT id
id name
name discount
discount
FROM
FROM scustom UP
scustom UP TO
TO 10
10 ROWS
ROWS
INTO (xid, xname, xdiscount)
INTO (xid, xname, xdiscount)
WHERE
WHERE custtype
custtype == ´B´
´B´
ORDER
ORDER BY discount.
BY discount.
WRITE:
WRITE: // xid,
xid, xname,
xname, xdiscount.
xdiscount.
ENDSELECT.
ENDSELECT.
Page 29
Minimize the Amount of Transferred Data
SELECT
SELECT ** FROM
FROM sflight
sflight
INTO xflight
INTO xflight
WHERE
WHERE carrid
carrid ='LH'.
='LH'.
xflight-seatsocc
xflight-seatsocc == xflight-seatsocc
xflight-seatsocc ++ 1.
1.
UPDATE
UPDATE sflight FROM xflight.
sflight FROM xflight.
ENDSELECT.
ENDSELECT.
UPDATE
UPDATE sflight
sflight
SET
SET seatsocc
seatsocc == seatsocc
seatsocc ++ 11
WHERE carrid = 'LH'.
WHERE carrid = 'LH'.
Page 30
Minimize the Amount of Transferred Data
SELECT
SELECT carrid
carrid connid
connid fldate
fldate MAX(
MAX( luggweight
luggweight ))
INTO
INTO (xcarrid, xconnid, xfldate, max)
(xcarrid, xconnid, xfldate, max)
FROM
FROM sbook
sbook
GROUP
GROUP BY
BY carrid
carrid connid
connid fldate.
fldate.
CHECK
CHECK max
max >> 20.
20.
WRITE:
WRITE: // xcarrid,
xcarrid, xconnid,
xconnid, xfldate,
xfldate, max.
max.
ENDSELECT.
ENDSELECT.
SELECT
SELECT carrid
carrid connid
connid fldate
fldate MAX(
MAX( luggweight
luggweight ))
INTO
INTO (xcarrid,
(xcarrid, xconnid,
xconnid, xfldate,
xfldate, max)
max)
FROM
FROM sbook
sbook
GROUP
GROUP BY
BY carrid
carrid connid
connid fldate
fldate
HAVING
HAVING MAX( luggweight )) >> 20.
MAX( luggweight 20.
WRITE:
WRITE: // xcarrid,
xcarrid, xconnid,
xconnid, xfldate,
xfldate, max.
max.
ENDSELECT.
ENDSELECT.
Page 31
Effects of Rule 2
App Server Table Buffer
memory
consumption App Server
CPU consumption
R/3 work process R/3 work process R/3 work process
LAN
communication
DB CPU
consumption
DB memory
consumption Database
Database cache Service
processes
Physical I/O
Operating system
Database files
ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 32
Page 32
Rule 3: Keep the Number of Round Trips Small
Rule 3:
Keep the number of round trips
between the database
and the application server small
Page 33
Keep the Number of Round Trips Small
LOOP
LOOP AT
AT itab
itab INTO
INTO wa.
wa.
INSERT
INSERT INTO sbook
INTO sbook VALUES
VALUES wa.
wa.
ENDLOOP.
ENDLOOP.
INSERT
INSERT sbook
sbook FROM
FROM TABLE
TABLE itab.
itab.
Page 34
Keep the Number of Round Trips Small
SELECT
SELECT f~carrid
f~carrid f~connid
f~connid b~bookid
b~bookid
INTO
INTO (xcarrid, xconnid,
(xcarrid, xconnid, xbookid)
xbookid)
FROM
FROM sflight
sflight ASAS ff INNER
INNER JOIN
JOIN sbook
sbook AS
AS bb
ON
ON f~carrid = b~carrid AND f~connid == b~connid
f~carrid = b~carrid AND f~connid b~connid
AND
AND f~fldate
f~fldate == b~fldate.
b~fldate.
WRITE:
WRITE: // xcarrid,
xcarrid, xconnid,
xconnid, xbookid.
xbookid.
ENDSELECT.
ENDSELECT.
Page 35
Keep the Number of Round Trips Small
SELECT
SELECT f~carrid
f~carrid f~connid
f~connid f~fldate
f~fldate b~bookid
b~bookid
INTO
INTO (xcarrid,
(xcarrid, xconnid,
xconnid, xfldate,
xfldate, xbookid)
xbookid)
FROM
FROM sflight
sflight ASAS ff LEFT
LEFT OUTER
OUTER sbook
sbook AS
AS bb
ON
ON f~carrid = b~carrid AND f~connid == b~connid
f~carrid = b~carrid AND f~connid b~connid
AND
AND f~fldate
f~fldate == b~fldate.
b~fldate.
WRITE:
WRITE: // xcarrid,
xcarrid, xconnid,
xconnid, xfldate,
xfldate, xbookid.
xbookid.
ENDSELECT.
ENDSELECT.
Page 36
Keep the Number of Round Trips Small
Use subqueries
SELECT
SELECT carrid
carrid connid
connid MAX(
MAX( seatsocc
seatsocc ))
FROM sflight
FROM sflight
INTO
INTO (xarrid,
(xarrid, xconnid,
xconnid, max)
max)
GROUP
GROUP BY carrid connid
BY carrid connid
ORDER
ORDER BY
BY carrid
carrid connid.
connid.
SELECT
SELECT fldate FROM
fldate FROM sflight
sflight
INTO yfldate
INTO yfldate
WHERE
WHERE carrid
carrid == xcarrid
xcarrid AND
AND connid
connid == xconnid
xconnid
AND
AND seatsocc
seatsocc == max
max
ORDER
ORDER BY
BY fldate
fldate
WRITE:
WRITE: // xcarrid,
xcarrid, xconnid,
xconnid, yfldate.
yfldate.
ENDSELECT.
ENDSELECT.
ENDSELECT.
ENDSELECT.
SELECT
SELECT carrid
carrid connid
connid fldate
fldate
INTO
INTO (xcarrid, xconnid,
(xcarrid, xconnid, xfldate,
xfldate, xseatsocc)
xseatsocc)
FROM sflight AS
FROM sflight AS f f
WHERE
WHERE seatsocc
seatsocc ININ
(( SELECT
SELECT MAX(
MAX( seatsocc
seatsocc )) FROM
FROM sflight
sflight
WHERE
WHERE carrid = f~carrid AND
carrid = f~carrid AND connid
connid == f~connid
f~connid ))
ORDER BY carrid connid fldate.
ORDER BY carrid connid fldate.
WRITE:
WRITE: xcarrid,
xcarrid, xconnid,
xconnid, xfldate.
xfldate.
ENDSELECT.
ENDSELECT.
ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 37
Page 37
Keep the Number of Round Trips Small
SELECT
SELECT carrid
carrid connid
connid bookid
bookid
INTO
INTO (xcarrid,
(xcarrid, xconnid,
xconnid, xbookid)
xbookid)
FROM
FROM sflightbook.
sflightbook.
WRITE:
WRITE: // xcarrid,
xcarrid, xconnid,
xconnid, xbookid.
xbookid.
ENDSELECT.
ENDSELECT.
Page 38
Effects of Rule 3
App Server Table Buffer
memory
consumption App Server
CPU consumption
R/3 work process R/3 work process R/3 work process
LAN
communication
DB CPU
consumption
DB memory
consumption Database
Database cache Service
processes
Physical I/O
Operating system
Database files
ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 39
Page 39
Rule 4: Keep the Cost of the Search Down
Page 40
Keep the Cost of the Search Down
SELECT
SELECT bookid
bookid
FROM
FROM sbook
sbook INTO
INTO xflight
xflight
WHERE
WHERE orderdate == ´20000304´.
orderdate ´20000304´.
WRITE:
WRITE: // xbookid.
xbookid.
ENDSELECT.
ENDSELECT.
SELECT
SELECT bookid
bookid
FROM
FROM sbook
sbook INTO
INTO xbookid
xbookid
WHERE
WHERE carrid == ´LH
carrid ´LH ’’ AND
AND
connid
connid == ´0300’
´0300’ AND
AND
fldate
fldate == ´20000304´.
´20000304´.
WRITE:
WRITE: // xbookid.
xbookid.
ENDSELECT.
ENDSELECT.
Page 41
Reasonable Index Design
Page 42
Keep the Cost of the Search Down
Make sure that, within the WHERE clause, the first n fields of
the designated index are stated with EQ
SELECT
SELECT ** FROM
FROM sflight
sflight
INTO xflight
INTO xflight
WHERE
WHERE carrid
carrid == ´LH
´LH ’’ AND
AND
fldate
fldate LIKE ´1998%´.
LIKE ´1998%´.
WRITE:
WRITE: // xflight-fldate.
xflight-fldate.
ENDSELECT.
ENDSELECT.
SELECT
SELECT ** FROM
FROM sflight
sflight
INTO
INTO xflight
xflight
WHERE
WHERE carrid
carrid == ´LH
´LH ’’ AND
AND
connid
connid = ´0300’ AND
= ´0300’ AND
fldate
fldate LIKE
LIKE ´1998%´.
´1998%´.
WRITE: / xflight-fldate.
WRITE: / xflight-fldate.
ENDSELECT.
ENDSELECT.
Page 43
Keep the Cost of the Search Down
SELECT
SELECT ** FROM
FROM sflight
sflight
INTO xflight
INTO xflight
WHERE
WHERE carrid
carrid == ´LH
´LH ’’ AND
AND
(connid
(connid = ´0300’
= ´0300’ OR
OR connid
connid == ´0302’)
´0302’) AND
AND
fldate LIKE ´1998%´.
fldate LIKE ´1998%´.
WRITE:
WRITE: // xflight-fldate.
xflight-fldate.
ENDSELECT.
ENDSELECT.
SELECT
SELECT ** FROM
FROM sflight
sflight
INTO xflight
INTO xflight
WHERE
WHERE carrid
carrid == ´LH
´LH ’’ AND
AND
connid
connid ININ (´0300’,
(´0300’, ´0302’)
´0302’) AND
AND
fldate LIKE ´1998%´.
fldate LIKE ´1998%´.
WRITE:
WRITE: // xflight-fldate.
xflight-fldate.
ENDSELECT.
ENDSELECT.
Page 44
Keep the Cost of the Search Down
SELECT
SELECT ** FROM
FROM sflight
sflight
INTO xflight
INTO xflight
WHERE
WHERE carrid
carrid <><> ´LH
´LH ’’ AND
AND
connid = ´0300’.
connid = ´0300’.
WRITE:
WRITE: // xflight-fldate.
xflight-fldate.
ENDSELECT.
ENDSELECT.
SELECT
SELECT ** FROM
FROM sflight
sflight
INTO xflight
INTO xflight
WHERE
WHERE carrid
carrid ININ (´AA
(´AA ’,
’, ´QM
´QM ’)
’) AND
AND
connid = ´0300’.
connid = ´0300’.
WRITE:
WRITE: // xflight-fldate.
xflight-fldate.
ENDSELECT.
ENDSELECT.
Page 45
Keep the Cost of the Search Down
SELECT
SELECT carrid
carrid connid
connid cityfrom
cityfrom
FROM
FROM spfli INTO (xcarrid,
spfli INTO (xcarrid, xconnid,
xconnid, xcityfrom)
xcityfrom)
WHERE
WHERE carrid = ´LH ’ AND cityfrom == ´FRANKFURT’.
carrid = ´LH ’ AND cityfrom ´FRANKFURT’.
WRITE:
WRITE: // xcarrid,
xcarrid, xconnid,
xconnid, xcityfrom.
xcityfrom.
ENDSELECT.
ENDSELECT.
SELECT
SELECT carrid
carrid connid
connid cityfrom
cityfrom
FROM
FROM spfli INTO (xcarrid,
spfli INTO (xcarrid, xconnid,
xconnid, xcityfrom)
xcityfrom)
WHERE
WHERE carrid = ´LH ’ AND cityfrom == ´FRANKFURT’
carrid = ´LH ’ AND cityfrom ´FRANKFURT’
%_HINTS
%_HINTS ORACLE
ORACLE ´INDEX(“SPFLI”
´INDEX(“SPFLI” “SPFLI~001”)’.
“SPFLI~001”)’.
WRITE:
WRITE: // xcarrid,
xcarrid, xconnid,
xconnid, xcityfrom.
xcityfrom.
ENDSELECT.
ENDSELECT.
Page 46
Effects of Rule 4
App Server Table Buffer
memory
consumption App Server
CPU consumption
R/3 work process R/3 work process R/3 work process
LAN
communication
DB CPU
consumption
DB memory
consumption Database
Database cache Service
processes
Physical I/O
Operating system
Database files
ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 47
Page 47
Rule 5: Remove the Load From the Database
Page 48
Remove the Load From the Database
SELECT
SELECT SINGLE
SINGLE ** FROM
FROM scarr
scarr
INTO xcarr
INTO xcarr
WHERE
WHERE carrid
carrid == ´LH
´LH ’.
’.
SELECT
SELECT SINGLE
SINGLE ** FROM
FROM scarr
scarr
INTO xcarr
INTO xcarr
WHERE
WHERE carrid
carrid == ´LH
´LH ’.
’.
Page 49
Criteria for Table Buffering
Pros
• Frequently read
• Relatively small
• Content can be “fuzzy”
Cons
• Heavily changed
• Content must always be up-to-date
Page 50
Statements That Bypass the Table Buffer
Page 51
Remove the Load From the Database
SELECT
SELECT SINGLE
SINGLE ** FROM
FROM scarr
scarr
INTO
INTO xcarr
xcarr
WHERE
WHERE carrid
carrid == ´LH
´LH ’.
’.
...
...
SELECT
SELECT SINGLE
SINGLE ** FROM
FROM scarr
scarr
INTO zcarr
INTO zcarr
WHERE
WHERE carrid
carrid == ´LH
´LH ’.
’.
...
...
SELECT
SELECT SINGLE
SINGLE ** FROM
FROM scarr
scarr
INTO xcarr
INTO xcarr
WHERE
WHERE carrid
carrid == ´LH
´LH ’.
’.
...
...
Page 52
Remove the Load From the Database
SELECT
SELECT SINGLE
SINGLE ** FROM
FROM sflight
sflight
INTO xflight
INTO xflight
WHERE
WHERE carrid
carrid == ´LH
´LH ’’ AND
AND
connid
connid == ´0300’
´0300’ AND
AND
fldate
fldate == ´20000204´.
´20000204´.
xflight-seatsocc
xflight-seatsocc == 1.1.
UPDATE
UPDATE sflight
sflight FROM
FROM xflight.
xflight.
UPDATE
UPDATE sflight
sflight
SET
SET seatsocc
seatsocc == 11
WHERE
WHERE carrid
carrid == ´LH
´LH ’’ AND
AND
connid
connid = ´0300’ AND
= ´0300’ AND
fldate
fldate == ´20000204´.
´20000204´.
Page 53
Remove the Load From the Database
Page 54
Effects of Rule 5
App Server Table Buffer
memory
consumption App Server
CPU consumption
R/3 work process R/3 work process R/3 work process
LAN
communication
DB CPU
consumption
DB memory
consumption Database
Database cache Service
processes
Physical I/O
Operating system
Database files
ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 55
Page 55
Rule 0: Think and Experiment
Page 56
Think and Experiment
Page 57
That’s it.
Page 58
Copyright 2000 SAP AG (All rights reserved)
ÿ Some software products marketed by SAP AG and its distributors contain proprietary
software components of other software vendors.
ÿ Microsoft®, WINDOWS®, NT®, EXCEL®, Word® and SQL-Server® are registered trademarks of
Microsoft Corporation.
ÿ IBM®, DB2®, OS/2®, DB2/6000®, Parallel Sysplex®, MVS/ESA®, RS/6000®, AIX®, S/390®,
AS/400®, OS/390®, and OS/400® are registered trademarks of IBM Corporation.
ÿ UNIX®, X/Open®, OSF/1®, and Motif® are registered trademarks of The Open Group.
ÿ SAP, SAP-Logo, mySAP.com, R/2, R/3, RIVA, ABAP, SAP-EDI, SAP Business Workflow, SAP
EarlyWatch, SAP ArchiveLink, ALE/WEB, BAPI, SAPPHIRE, Management Cockpit, SEM, are
trademarks or registered trademarks of SAP AG in Germany and in several other countries
all over the world. All other products mentioned are trademarks or registered trademarks of
their respective companies.
Page 59