Application Development 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: 

FOR ALL ENTRIES

Former Member
0 Kudos

Hello GURU'S,

What are the pre-considerations for the common "FOR ALL ENTRIES" and How many Select queries will be fired in "FOR ALL ENTRIES"?

help me.

with regards

K.Saravanakumar.

6 REPLIES 6

Former Member
0 Kudos

Hi,

The pre-conditions before using FOR ALL ENTRIES are

1)the previous internal table should have atleast one record

if u dont have atleast one record in the previous internal table then the select statement which is using for all entries fetches all the records from the database.

2)and the table should be *sorted *

All abap programers and most of the dba's that support abap programmers are familiar with the abap clause "for all entries". Most of the web pages I visited recently, discuss 3 major drawbacks of the "for all entries" clause:

1. duplicate rows are automatically removed

2. if the itab used in the clause is empty , all the rows in the source table will be selected .

3. performance degradation when using the clause on big tables.

In this post I'd like to shed some light on the third issue. Specifically i'll discuss the use of the "for all entries" clause as a means to join tables in the abap code instead of in db2.

Say for example you have the following abap code:

Select * from mara

For all entries in itab

Where matnr = itab-matnr.

If the actual source of the material list (represented here by itab) is actually another database table, like:

select matnr from mseg

into corresponding fields of table itab

where ?.

Then you could have used one sql statement that joins both tables.

Select t1.*

From mara t1, mseg t2

Where t1.matnr = t2.matnr

And T2?..

So what are the drawbacks of using the "for all entires" instead of a join ?

At run time , in order to fulfill the "for all entries " request, the abap engine will generate several sql statements (for detailed information on this refer to note 48230). Regardless of which method the engine uses (union all, "or" or "in" predicates) If the itab is bigger then a few records, the abap engine will break the itab into parts, and rerun an sql statement several times in a loop. This rerun of the same sql statement , each time with different host values, is a source of resource waste because it may lead to re-reading of data pages.

returing to the above example , lets say that our itab contains 500 records and that the abap engine will be forced to run the following sql statement 50 times with a list of 10 values each time.

Select * from mara

Where matnr in ( ...)

Db2 will be able to perform this sql statement cheaply all 50 times, using one of sap standard indexes that contain the matnr column. But in actuality, if you consider the wider picture (all 50 executions of the statement), you will see that some of the data pages, especially the root and middle-tire index pages have been re-read each execution.

Even though db2 has mechanisms like buffer pools and sequential detection to try to minimize the i/o cost of such cases, those mechanisms can only minimize the actual i/o operations , not the cpu cost of re-reading them once they are in memory. Had you coded the join, db2 would have known that you actually need 500 rows from mara, it would have been able to use other access methods, and potentially consume less getpages i/o and cpu.

In other words , when you use the "for all entries " clause instead of coding a join , you are depriving the database of important information needed to select the best access path for your application. Moreover, you are depriving your DBA of the same vital information. When the DBA monitors & tunes the system, he (or she) is less likely to recognize this kind of resource waste. The DBA will see a simple statement that uses an index , he is less likely to realize that this statement is executed in a loop unnecessarily.

reward if helpful

raam

0 Kudos

thank u so much.... ur answer is very helpful.

hw many select queries can be fired for FOR ALL ENTRIES?

0 Kudos

hi,

Only single select statement will be fired ....

0 Kudos

Hi,

as said by santosh it is only one select statement.

it is not how many select quires fired per a FOR ALL ENTRIES statement.

FOR ALL ENTRIES fetches all records from database comparing the entries in the previous internal table.

if u have only one record in the previous internal table then

FOR ALL ENTRIES statement fetches the records from database comparing the single record in the previous internal table.

reward if helpful

raam

0 Kudos

I truly appreciate the response by Mr. Reddy...it was a kind of a myth buster and helped me a lot to develop my concepts further...

..thanks a lot Mr. Reddy..

Former Member
0 Kudos

hi,

1. You got to sort the table whenever you use for all entries statement .

2. Check if the table is initial or not .... i.e,


 if not it_mara[] is initial.
    select * from marc into table it_marc for all entries in it_mara ...
 endif.