Application Development and Automation Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 
Read only

Reduce execution time with selects

Former Member
0 Likes
871

Hi,

I have to reduce the execution time in a report, most of the consumed time is in the select query.

I have a table, gt_result:

DATA: BEGIN OF gwa_result,

tknum LIKE vttk-tknum,

stabf LIKE vttk-stabf,

shtyp LIKE vttk-shtyp,

route LIKE vttk-route,

vsart LIKE vttk-vsart,

signi LIKE vttk-signi,

dtabf LIKE vttk-dtabf,

vbeln LIKE likp-vbeln,

/bshm/le_nr_cust LIKE likp-/bshm/le_nr_cust,

vkorg LIKE likp-vkorg,

werks LIKE likp-werks,

regio LIKE kna1-regio,

land1 LIKE kna1-land1,

xegld LIKE t005-xegld,

intca LIKE t005-intca,

bezei LIKE tvrot-bezei,

bezei1 LIKE t173t-bezei,

fecha(10) type c.

DATA: END OF gwa_result.

DATA: gt_result LIKE STANDARD TABLE OF gwa_result.

And the select query is this:

SELECT ktknum kstabf kshtyp kroute kvsart ksigni

k~dtabf

lvbeln l/bshm/le_nr_cust lvkorg lwerks nregio nland1 oxegld ointca

tbezei ttbezei

FROM vttk AS k

INNER JOIN vttp AS p ON ktknum = ptknum

INNER JOIN likp AS l ON pvbeln = lvbeln

INNER JOIN kna1 AS n ON lkunnr = nkunnr

INNER JOIN t005 AS o ON nland1 = oland1

INNER JOIN tvrot AS t ON troute = kroute AND t~spras = sy-langu

INNER JOIN t173t AS tt ON ttvsart = kvsart AND tt~spras = sy-langu

INTO TABLE gt_result

WHERE ktknum IN s_tknum AND ktplst IN s_tplst AND k~route IN s_route AND

k~erdat BETWEEN s_erdat-low AND s_erdat-high AND

l~/bshm/le_nr_cust <> ' ' "IS NOT NULL

AND k~stabf = 'X'

AND ktknum NOT IN ( SELECT tktknum FROM vttk AS tk

INNER JOIN vttp AS tp ON tktknum = tptknum

INNER JOIN likp AS tl ON tpvbeln = tlvbeln

WHERE l~/bshm/le_nr_cust IS NULL )

AND k~tknum NOT IN ( SELECT tknum FROM /bshs/ssm_eship )

AND ( o~xegld = ' '

OR ( o~xegld = 'X' AND

( ( n~land1 = 'ES'

AND ( nregio = '51' OR nregio = '52'

OR nregio = '35' OR nregio = '38' ) )

OR n~land1 = 'ESC' ) )

OR ointca = 'AD' OR ointca = 'GI' ).

Does somebody know how to reduce the execution time ?.

Thanks.

6 REPLIES 6
Read only

dani_mn
Active Contributor
0 Likes
788

You are joining to many tables.

Try to restrict the joins to 1 level only ie only for 2 tables.

Try to avoid joins and use FOR ALL ENTRIES.

Regards,

Wasim Ahmed

Read only

Former Member
0 Likes
788

It is not advisable to use more than 3 joins in one select statement.

Create more than one internal table.

Select using 3 inner join and put the record in one internal table.Again use another select statement with 3 inner joins , use for all entries 'first internal table'.

Read only

former_member183804
Active Contributor
0 Likes
788

Hello Mario,

avoid any join for extra data. Any join is bypassing the SAP table buffering. For the inner select use for all entries as alternative.

Best Regards

Klaus

Read only

Former Member
0 Likes
788

Hi,

Try to remove the join. Use seperate selects as shown in example below and for the sake of selection, keep some key fields in your internal table.

Then once your final table is created, you can copy the table into GT_FINAL which will contain only fields you need.

EX

data : begin of it_likp occurs 0,

vbeln like likp-vbeln,

/bshm/le_nr_cust like likp-/bshm/le_nr_cust,

vkorg like likp-vkorg,

werks like likp-werks,

kunnr likr likp-kunnr,

end of it_likp.

data : begin of it_kna1 occurs 0,

kunnr like...

regio....

land1...

end of it_kna1 occurs 0,

Select tknum stabf shtyp route vsart signi dtabf

from VTTP

into table gt_result

WHERE tknum IN s_tknum AND

tplst IN s_tplst AND

route IN s_route AND

erdat BETWEEN s_erdat-low AND s_erdat-high.

select vbeln /bshm/le_nr_cust

vkorg werks kunnr

from likp

into table it_likp

for all entries in gt_result

where vbeln = gt_result-vbeln.

select kunnr

regio

land1

from kna1

into it_kna1

for all entries in it_likp.

similarly for other tables.

Then loop at gt result and read corresponding table and populate entire record :

loop at gt_result.

read table it_likp where vbeln = gt_result-vbeln.

if sy-subrc eq 0.

move corresponding fields of it_likp into gt_result.

gt_result-kunnr = it_likp-kunnr.

modify gt_result.

endif.

read table it_kna1 where kunnr = gt_result-vbeln.

if sy-subrc eq 0.

gt_result-regio = it-kna1-regio.

gt_result-land1 = it-kna1-land1.

modify gt_result.

endif.

endloop.

Read only

andreas_mann3
Active Contributor
0 Likes
788

hi,

never seen such a select .:)

it's an artist's work but very "performant" -i think

so:

1) select all CU and master tables into sorted / hashed tables and use later read table...

2) use a join only for likp and vttp

and unknot your where-clause

hope that helps

Andreas

Read only

Former Member
0 Likes
788

Wow - that's a pretty complicated select. I think the first thing I would do is simplify it as much as possible. Remove some of the joins and subqueries and test them separately. If any of the where clauses (on the larger tables) aren't using a key, that will slow down the entire statement. Also check to make sure that none of the select-options are empty.

Rob