As simple as FETCH is, using INDEXes in JOIN operations is a little more complex. The most obvious form is a "full-keyed" JOIN, specified by the KEYED option, which, nominates an INDEX into the right-hand recordset (the second JOIN parameter). The purpose for this form is to handle situations where the left-hand recordset (named as the first parameter to the JOIN) is a fairly small dataset that needs to join to a large, indexed dataset (the right-hand recordset). By using the KEYED option, the JOIN operation uses the specified INDEX to find the matching right-hand records. This means that the join condition must use the key fields in the INDEX to find matching records.
This example code (contained in the IndexFullKeyedJoin.ECL file) illustrates the usual use of a full-keyed join:
IMPORT $; r1 := RECORD $.DeclareData.Layout_Person; $.DeclareData.Layout_Accounts; END; r1 Xform1($.DeclareData.Person.FilePlus L, $.DeclareData.Accounts R) := TRANSFORM SELF := L; SELF := R; END; J1 := JOIN($.DeclareData.Person.FilePlus(PersonID BETWEEN 1 AND 100), $.DeclareData.Accounts, LEFT.PersonID=RIGHT.PersonID, Xform1(LEFT,RIGHT), KEYED($.DeclareData.IDX_Accounts_PersonID)); OUTPUT(J1,ALL);
The right-hand Accounts file contains five million records, and with the specified filter condition the left-hand Person recordset contains exactly one hundred records. A standard JOIN between these two would normally require that all five million Accounts records be read to produce the result. However, by using the KEYED option the INDEX's binary tree is used to find the entries with the appropriate key field values and get the pointers to the exact set of Accounts records required to produce the correct result. That means that the only records read from the right-hand file are those actually contained in the result.