# create arrays let LINEITEM2 = LINEITEM feed consume; let LINEITEM_25 = LINEITEM feed extend[Pkg: seqnext() mod 25] distribute[Pkg]; let LINEITEM_50 = LINEITEM feed extend[Pkg: seqnext() mod 50] distribute[Pkg]; let LINEITEM_100 = LINEITEM feed extend[Pkg: seqnext() mod 100] distribute[Pkg]; let LINEITEM_200 = LINEITEM feed extend[Pkg: seqnext() mod 200] distribute[Pkg]; let ORDERS_25 = ORDERS feed extend[Pkg: seqnext() mod 25] distribute[Pkg]; let ORDERS_50 = ORDERS feed extend[Pkg: seqnext() mod 50] distribute[Pkg]; let CUSTOMER_25 = CUSTOMER feed extend[Pkg: seqnext() mod 25] distribute[Pkg]; let CUSTOMER_50 = CUSTOMER feed extend[Pkg: seqnext() mod 50] distribute[Pkg]; # create a btree for L_PARTKEY let LINEITEM_L_PARTKEY = LINEITEM createbtree[L_PARTKEY]; let LINEITEM_L_PARTKEY_25 = LINEITEM_25 loop[. createbtree[L_PARTKEY]]; # create arrays of relations with special join selectivities query seqinit(1); #increment L_ModNr every 100 tuples let LINEITEM_TMP = LINEITEM feed extend[L_ModNr: seqnext() div 100] consume; #distribute values L_JoinKey between 0..L_ModNr. L_ModNr changes every 100 tuples let LINEITEM_J1 = LINEITEM_TMP feed extend[L_IsOne: 1, L_JoinKey: seqnext() mod (.L_ModNr + 1) ] consume; query seqinit(1); # create an array. Put every 50 tuples in a new slot let LINEITEM_J1_A = LINEITEM_J1 feed extend[Pkg: (seqnext() div 100)] distribute[Pkg]; # compute selectivity per slot query LINEITEM_J1_A loop[ . feed . feed {x} hashjoin[L_JoinKey, L_JoinKey_x, 101] count / (. count * . count)]; # compute selectivity with LINEITEM_J1 query LINEITEM_J1_A loop[ . feed LINEITEM_J1 feed {x} hashjoin[L_JoinKey, L_JoinKey_x, 101] count / (. count * LINEITEM_J1 count)]; # overall selectivity for equi join on L_JoinKey query LINEITEM_J1 feed LINEITEM_J1 feed {x} hashjoin[L_JoinKey, L_JoinKey_x, 101] count / (LINEITEM_J1 count * LINEITEM_J1 count); # selectivity for equi join on L_PARTKEY query LINEITEM feed LINEITEM feed {x} hashjoin[L_PARTKEY, L_PARTKEY_x, 101] count / (LINEITEM count * LINEITEM count); # selectivity for non equi join (>=) on L_PARTKEY #query LINEITEM feed LINEITEM feed {x} symmproduct[.L_PARTKEY >= ..L_PARTKEY_x] count / (LINEITEM count * LINEITEM count); let LINEITEM_J1_L_JoinKey = LINEITEM_J1 createbtree[L_JoinKey]; # Expensive user defined functions let fx2 = fun(n: int) LINEITEM feed LINEITEM feed {x} symmproduct[ .L_PARTKEY = ..L_PARTKEY_x ] head[n] count