Hi guys! I have 2 READ loops: the first READ loop reads 10 records in DESCENDING order and stores the ISN of the 10th record; the second READ should start reading the records from this ISN (this one has a STARTING WITH ISN clause). But this clause seems not to be working in the READ 2. I printed #ISN-START value after READ 1 and the ISNs of the records read in the READ 2, but the same 10 records read in READ 1 are being read in the READ 2 and I don’t understand why.
Could someone give me a little hand with this? Thanks in advance.
READ-1. READ MULTI-FETCH OF 300 FILE DESCENDING
BY SUPER FROM #SUPER-INI TO #SUPER-FIM
*
ADD 1 TO #COUNT
*
IF #COUNT = 10
#ISN-START := *ISN
ESCAPE BOTTOM
END-IF
END-READ
*
READ-2. READ MULTI-FETCH OF 300 FILE DESCENDING
BY SUPER FROM #SUPER-INI TO #SUPER-FIM
STARTING WITH ISN = #ISN-START
.....
END-READ
Also. If you want to really continue from the record 10 then recognize you should store Starting value as well.
When doing a read logical the STARTING with ISN is within the starting Value. This is designed for restarting when a DE (or SUPER) has multiple ISNs with same value.
For Example: READ EMPLOYEES by NAME = ‘SMITH’ Starting with ISN #LASTISNPLUS1.
More than 25. More than that gives marginal results and in your case actually hurts performance as you are asking ADABAS to read and return 300 records but only processing first 10…
This is from the ADABAS command reference manual. It is saying the same thing Gene said.
Rules for Reading Backward (Descending Option)
If the starting descriptor value specified in the value buffer is present in the logical read sequence, specifying:
■ an ISN of zero results in positioning to the last (highest) ISN with that descriptor value;
■ a non-zero ISN results in positioning to the highest ISN less than the specified ISN with that descriptor value, if such an ISN exists. Otherwise, positioning is to the last ISN of the next
lower descriptor value.
If the starting descriptor value specified in the value buffer is not present in the logical read sequence, positioning is always to the last ISN of the next lower descriptor value, regardless of the specified ISN.
Eugene is correct. To use STARTING WITH ISN you must also specify the descriptor. Your program would look like this:
READ-1. READ MULTI-FETCH OF 10 FILE DESCENDING
BY SUPER FROM #SUPER-INI TO #SUPER-FIM
*
ADD 1 TO #COUNT
*
IF #COUNT = 10
#ISN-START := *ISN
#SUPER-FIM-2 = SUPER
ESCAPE BOTTOM
END-IF
END-READ
*
READ-2. READ MULTI-FETCH OF 300 FILE DESCENDING
BY SUPER FROM #SUPER-INI TO #SUPER-FIM-2
STARTING WITH ISN = #ISN-START
.....
END-READ
Also be aware that STARTING WITH ISN actually does not start with the ISN specified but with the next record. For example, if I had the following data:
RECORD SUPER ISN
R1 ABC 10
R2 ABD 15
R3 ABD 25
R4 ABD 30
R5 ABE 12
and I did:
READ FILE BY SUPER FROM 'ABD' STARTING WITH ISN 25
The first record read would be R4. If I was reading in descending order:
READ FILE DESCENDING BY SUPER FROM 'ABD' STARTING WITH ISN 25
This is deviating from initial problem, so I have changed the Subject.
So let’s take your example of 600 records read.
If you don’t use Multifetch you would have 600 ADABAS calls. If you choose a Multifetch of 10 you would have 60 adabas calls, a 90% improvement. If we go to MF of 25 then we will have 24 Calls a 96% improvement (but only 6% better than 10). If we go to MF of 50 then we will have 12 calls, a 98% improvement (but on 2% better than 25).
So you can see this is the law of diminishing returns. I find going beyond 25 doesn’t give me much but requires larger buffers and may degrade performance if we end up reading more records than we need.
Because it is reading DESCENDING. The FROM key value still needs to precede the TO key value so we read TO #SUPER-FIM-2, but we are really starting from there and reading backwards.