I want to implement a multifetch access in a existing program that uses sequential(physical) read of Adabas records.
I think, Following parameters would be additionally required/set to make the existing ADABAS call
ISN lower limit (ACBISL) - 0 (To get as many records or 3)
Command Option 1 (ACBCOP1) ‘M’
Record buffer length (ACBRBL) reclength * 3
ISN buffer length (ACBIBL) 52(for 3 records, 16*3+4)
I have specified record buffer that has enough space to accomodate 3 records. record buffer length is set as 3 times length of record(9054*3).
But still I get a single record as a result of ADABAS CALL: Nr. of records in ISN buffer is 1, and returncode of ISN buffer records are 0. What would have been wrong in the implementation? I have checked the documentation , I couldnt find any examples other than the description of parmeters as described above.
how you’re setting the call parameters looks correct.
Below is a snapshot from the employees file with the expected 3 records - see below.
If you get back only one record do you also get the related multifetch record descriptor in the ISN Buffer?
Is the record size in the element the same as your calculated record size?
Do you have variable fields or occurrences specified?
In some scenarios intermediate components may limit the use of multifetch (e.g. user exits). Do you have any of those?
What is your environment? I.e. batch/tp Adabas version.
CID DBI FNR RSP ISN ISL ISQ FBL RBL SBL VBL IBL OP1 OP2
L2 EMPL 8 11 0 1 0 0 32 2000 128 128 52 M
RB 50005500BRAUN 50004900CAOUDAL 50004600VERDIE
CB 0000 C100D3F2 C5D4D7D3 000B0000 00000001 *A L2EMPL *
CB 0010 00000000 00000000 002007D0 00800080 * *
CB 0020 0034D440 40404040 40404040 00FC0054 * M *
CB 0030 40404040 40404040 40404040 40810008 * a *
CB 0040 40404040 00000000 00000003 40404040 * *
FB 0000 C1C16BC1 C54B4040 40404040 40404040 *AA,AE. *
FB 0010 40404040 40404040 40404040 40404040 * *
RB 0000 F5F0F0F0 F5F5F0F0 C2D9C1E4 D5404040 *50005500BRAUN *
RB 0010 40404040 40404040 40404040 F5F0F0F0 * 5000*
RB 0020 F4F9F0F0 C3C1D6E4 C4C1D340 40404040 *4900CAOUDAL *
RB 0030 40404040 40404040 F5F0F0F0 F4F6F0F0 * 50004600*
RB 0040 E5C5D9C4 C9C54040 40404040 40404040 *VERDIE *
RB 0050 40404040 40404040 40404040 40404040 * *
IB 0000 00000003 0000001C 00000000 00000001 * *
IB 0010 00000000 0000001C 00000000 00000002 * *
IB 0020 00000000 0000001C 00000000 00000003 * *
IB 0030 00000000 * *
Thanks for the reply.
Multifetch descriptor of first record seems to be corect.It’s length is
9524, which is the length of a single record. Record buffer length was 28572.
There wasn’t any user exits.Test environment is batch.
Record structure is fixed length(There is no OCCURS …VARYING clause).
this is strange.
The only cases where the nucleus does not fill the buffer is when a response code is given or when the next record is held by some other user.
Are you using L2 or L5?
Which version of Adabas and OS are you using? Any accelerators like Fastpath?
L2 command is being used in this case.
OS version is BS2000 / OSD Vers. 5.0
Adarep output shows “A D A R E P V7.4.”
But anyway, I need to improve the performance of a sequential Physical
read. What about using ADARUN and externally specifying prefetch
buffers. Would it improve the performance?
that looks like a problem then. Do you get more records with a smaller logical record size (ie. less fields in the format)?
With batch programs you certainly should try the ADARUN PREFETCH=YES features. There you can parameterize multifetch operation without changing your application program.
Since ADARUN multifetch uses the same M option as your application I am curious if it returns multiple records. If it doesn’t you should gather diagnostic information (i.e. nucleus DDPRINT, command log with layout 5 with FB and RB and an ADAREP with the used file’s FDT) and contact Adabas support…