0% found this document useful (0 votes)
5 views

DB Programming With ABAP

Uploaded by

Nathan Leach
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
5 views

DB Programming With ABAP

Uploaded by

Nathan Leach
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 59

Database Programming

with ABAP

Dr. Ulrich Koch / Dr. Axel Kurka


SAP AG

ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 1

Page 1
Contents

R/3 and RDBMS Architecture

ABAP Open SQL

Performance Tools

Rules for a Better SQL Programming

ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 2

Page 2
Contents

R/3 and RDBMS Architecture

ABAP Open SQL

Performance Tools

Rules for a Better SQL Programming

ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 3

Page 3
Performance of Business Transactions

General rule:
The performance of a business transaction is primarily
determined by its DB accesses.

DB

Application

GUI

ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 4

Page 4
R/3 Architecture

Data transfer between DB server DB DB


and application server(s) WP cache

DB Server

local
User
WP data
communication
Application Server(s)

Frontend(s) / Presentation Server(s)

ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 5

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 work process DB work process DB work process

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

mandt carrid connid

cityfrom cityto
Secondary indices
•user defined
•unique or non-unique
airpfrom airpto

ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 7

Page 7
Organization of Indices

Index A Table Index B


Block 1
1 A
2 Record 4 B
3
Record 2

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

ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 8

Page 8
Statement Optimizer

... decides how to execute the SQL statement

rule-based

Execution Plan

SELECT * FROM sflight


INTO xflight
WHERE cityfrom = ‘OSLO’
AND fldate = ‘20000102’
ORDER BY carrid.

cost-based

ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 9

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

ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 10

Page 10
Table Buffering: Types

Full buffering Generic buffering Generic buffering Single-record buffering


(100%) 1 key field 2 key fields (partial)
key1 key2 key3 data
001 A 2
key1 key2 key3 data 001 A 4
001 A 001 B 1
key1 key2 key3 data 001 A 001 B 3
001 001 B 001 B 5
001 001 B 002 A 1
001 001 B
A 002 A 3
key1 key2 key3 data 001 001 B 002 A 6
002 002 B 002 A 8
002 002 B 002 B 1
002 002 B 002 B 2
002 002 C 002 B 3
002 002 C 002 C 0
002 002 D 002 C 1
003 003 A 002 D 5
003 003 A 003 A 2
003 003 A 003 A 3
003 003 B 003 A 6
003 003 B 003 B 2
003 003 C 003 B 4
003 003 C 003 C 2
003 003 C 003 C 3
003 D 003 C 5
003 D 003 C 8
003 D 003 D 1
003 D 2
003 D 3
003 D 4

ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 11

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.

ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 12

Page 12
Contents

R/3 and RDBMS Architecture

ABAP Open SQL

Performance Tools

Rules for a Better SQL Programming

ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 13

Page 13
Inner Join

CARRID CONNID CITYFROM CARRID CONNID FLDATE


AA 0017 FRANKFURT AA 0017 07.03.2000
LH 0402 NEW YORK AA 0017 12.03.2000
LH 0440 FRANKFURT LH 0402 08.03.2000
QF 0598 NEW YORK LH 0402 09.03.2000

INNER JOIN

CARRID CONNID CITYFROM CARRID CONNID FLDATE


AA 0017 FRANKFURT AA 0017 07.03.2000
AA 0017 FRANKFURT AA 0017 12.03.2000
LH 0402 NEW YORK LH 0402 08.03.2000
LH 0402 NEW YORK LH 0402 09.03.2000

ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 14

Page 14
Left Outer Join

CARRID CONNID CITYFROM CARRID CONNID FLDATE


AA 0017 FRANKFURT AA 0017 07.03.2000
LH 0402 NEW YORK AA 0017 12.03.2000
LH 0440 FRANKFURT LH 0402 08.03.2000
QF 0598 NEW YORK LH 0402 09.03.2000

LEFT OUTER JOIN

CARRID CONNID CITYFROM CARRID CONNID FLDATE


AA 0017 FRANKFURT AA 0017 07.03.2000
AA 0017 FRANKFURT AA 0017 12.03.2000
LH 0402 NEW YORK LH 0402 08.03.2000
LH 0402 NEW YORK LH 0402 09.03.2000
LH 0440 FRANKFURT NULL NULL NULL
QF 0598 NEW YORK NULL NULL NULL

ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 15

Page 15
Contents

R/3 and RDBMS Architecture

ABAP Open SQL

Performance Tools

Rules for a Better SQL Programming

ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 16

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.

ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 17

Page 17
SQL Trace

ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 18

Page 18
Execution Plan

ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 19

Page 19
Contents

R/3 and RDBMS Architecture

ABAP Open SQL

Performance Tools

Rules for a Better SQL Programming

ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 20

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

One or more tables

ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 21

Page 21
Rule 1: Keep the Hit List Small

Rule 1:
Keep the hit list small

ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 22

Page 22
Keep the Hit List Small

Use a WHERE clause whenever possible


SELECT
SELECT ** FROM
FROM sflight
sflight
INTO
INTO xflight.
xflight.
CHECK
CHECK xflight-carrid
xflight-carrid == ´LH
´LH ´.
´.
CHECK xflight-connid = ´0300´.
CHECK xflight-connid = ´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 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.

ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 23

Page 23
Keep the Hit List Small

Try to describe the full search condition

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.

ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 24

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 work process DB work process DB work process

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

ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 26

Page 26
Minimize the Amount of Transferred Data

Use a field list instead of SELECT *

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.

ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 27

Page 27
Minimize the Amount of Transferred Data

Use aggregate functions

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.

ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 28

Page 28
Minimize the Amount of Transferred Data

Apply UP TO n ROWS for a top-n solution set

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.

ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 29

Page 29
Minimize the Amount of Transferred Data

Use references with UPDATE

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'.

ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 30

Page 30
Minimize the Amount of Transferred Data

Apply the HAVING clause

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.

ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 31

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 work process DB work process DB work process

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

ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 33

Page 33
Keep the Number of Round Trips Small

Use high-speed array operations with UPDATE, INSERT,


DELETE, MODIFY

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.

ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 34

Page 34
Keep the Number of Round Trips Small

Apply the INNER JOIN


Avoid nested SELECT-ENDSELECT loops
SELECT
SELECT ** FROM
FROM sflight
sflight INTO
INTO xflight.
xflight.
SELECT
SELECT * FROM sbook INTO xbook
* FROM sbook INTO xbook
WHERE
WHERE carrid
carrid == xflight-carrid
xflight-carrid AND
AND
connid
connid = xflight-connid AND
= xflight-connid AND
fldate
fldate == xsflight-fldate.
xsflight-fldate.
WRITE:
WRITE: // xflight-carrid,
xflight-carrid, xflight-connid,
xflight-connid, xbook-bookid.
xbook-bookid.
ENDSELECT.
ENDSELECT.
ENDSELECT.
ENDSELECT.

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.

ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 35

Page 35
Keep the Number of Round Trips Small

Apply the OUTER JOIN


SELECT
SELECT ** FROM
FROM sflight
sflight INTO
INTO xflight.
xflight.
SELECT
SELECT * FROM sbook INTO xbook
* FROM sbook INTO xbook
WHERE
WHERE carrid
carrid == xflight-carrid
xflight-carrid
AND
AND connid == xflight-connid
connid xflight-connid
AND
AND fldate
fldate == xflight-fldate.
xflight-fldate.
WRITE:
WRITE: // xflight-carrid,
xflight-carrid, xflight-connid,
xflight-connid, xflight-fldate,
xflight-fldate,
xbook-bookid.
xbook-bookid.
ENDSELECT.
ENDSELECT.
IF
IF sy-dbcnt
sy-dbcnt == 0.0.
CLEAR
CLEAR xbook-bookid.
xbook-bookid.
WRITE:
WRITE: // xflight-carrid,
xflight-carrid, xflight-connid,
xflight-connid, xflight-fldate,
xflight-fldate,
xbook-bookid.
xbook-bookid.
ENDIF.
ENDIF.
ENDSELECT.
ENDSELECT.

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.

ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 36

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

For frequently used INNER JOINs, you can create a database


view in the ABAP Dictionary
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.

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.

ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 38

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 work process DB work process DB work process

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

Keep the cost of the search down

ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 40

Page 40
Keep the Cost of the Search Down

Specify the WHERE clause to keep the number of searches


down and create suitable indices if necessary

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.

ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 41

Page 41
Reasonable Index Design

• Place fields that are effective in the selection process at


the beginning
• The following fields are not effective in the selection
process: MANDT, BUKRS, GJAHR.
• Create small indices
• Avoid overlaps (disjunct indices)
• Up to 4 indices in each table do not have to be critical

ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 42

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.

ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 43

Page 43
Keep the Cost of the Search Down

Replace the inner OR with an IN operator

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.

ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 44

Page 44
Keep the Cost of the Search Down

You cannot process NOT operators in SELECT using an index

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.

ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 45

Page 45
Keep the Cost of the Search Down

Think about optimizer hints if the optimizer fails to find a sound


execution plan

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.

ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 46

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 work process DB work process DB work process

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

Remove the load from the database

ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 48

Page 48
Remove the Load From the Database

Check wether a table meets the criteria for Table Buffering

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 ’.
’.

ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 49

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

ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 50

Page 50
Statements That Bypass the Table Buffer

• SELECT ... BYPASSING BUFFER


• SELECT ... DISTINCT
• SELECT ... COUNT, SUM, AVG, MIN, MAX
• SELECT ... ORDER BY f1 ... fn
• SELECT ... GROUP BY / HAVING
• SELECT ... FOR UPDATE
• SELECT ... JOIN
• WHERE clause contains IS NULL statement
• WHERE clause contains subquery

ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 51

Page 51
Remove the Load From the Database

Avoid repeated reading of the same data

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 ’.
’.
...
...

ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 52

Page 52
Remove the Load From the Database

Check wether a SELECT is really needed before an UPDATE is


made

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´.

ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 53

Page 53
Remove the Load From the Database

Apply the ABAP SORT instead of the ORDER BY clause if the


desired sorting doesn’t correspond to the index used
SELECT
SELECT p~airpfrom
p~airpfrom p~airpto
p~airpto f~fldate
f~fldate p~deptime
p~deptime
INTO
INTO xflight
xflight
FROM
FROM spfli
spfli ASAS pp INNER
INNER JOIN
JOIN sflight
sflight AS
AS ff
ON
ON p~carrid
p~carrid = f~carrid
= f~carrid
AND
AND p~connid
p~connid == f~connid
f~connid
WHERE
WHERE p~carrid
p~carrid == 'LH'LH ''
ORDER
ORDER BY
BY p~airpfrom
p~airpfrom p~airpto
p~airpto f~fldate
f~fldate p~deptime.
p~deptime.
WRITE: / xflight-airpfrom, xflight-airpto,
WRITE: / xflight-airpfrom, xflight-airpto,
xflight-fldate,
xflight-fldate, xflight-deptime.
xflight-deptime.
ENDSELECT.
ENDSELECT.
SELECT
SELECT p~airpfrom
p~airpfrom p~airpto
p~airpto f~fldate
f~fldate p~deptime
p~deptime
INTO TABLE flights
INTO TABLE flights
FROM
FROM spfli
spfli AS
AS pp INNER
INNER JOIN
JOIN sflight
sflight AS
AS ff
ON
ON p~carrid
p~carrid = f~carrid
= f~carrid
AND
AND p~connid
p~connid == f~connid
f~connid
WHERE
WHERE p~carrid
p~carrid == 'LH
'LH '.
'.
SORT
SORT flights
flights BY
BY airpfrom
airpfrom airpto
airpto fldate
fldate deptime.
deptime.
LOOP
LOOP AT
AT flights
flights INTO
INTO xflight.
xflight.
WRITE:
WRITE: // xflight-airpfrom,
xflight-airpfrom, xflight-airpto,
xflight-airpto,
xflight-fldate,
xflight-fldate, xflight-deptime.
xflight-deptime.
ENDLOOP.
ENDLOOP.
ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 54

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 work process DB work process DB work process

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

Think and experiment!

ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 56

Page 56
Think and Experiment

• Take recommendations as rules of thumb rather than


laws
• Some of the rules unveil their benefits only if you use
tables of a certain minimum capacity
• Some of the goals of the rules are even inconsistent
• Recommendations hold true for all SAP-supported DB
systems

ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 57

Page 57
That’s it.

Thank you for


your attention and your time.

See you again.

ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 58

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.

ÿ OSF/Motif® is a registered trademark of Open Software Foundation.

ÿ ORACLE® is a registered trademark of ORACLE Corporation, California, USA.

ÿ INFORMIX®-OnLine for SAP is a registered trademark of Informix Software Incorporated.

ÿ UNIX®, X/Open®, OSF/1®, and Motif® are registered trademarks of The Open Group.

ÿ ADABAS® is a registered trademark of Software AG.

ÿ 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.

ÿ SAP AG 2000 k01 TechED Hamburg (Koch / Kurka) / 59

Page 59

You might also like