LOCAL i, lcList, lcQval, nSec, lcCmd * Create source data cursor CREATE CURSOR tmpSource (fs1 C(10), fs2 C(10)) FOR i = 1 TO 1000000 INSERT INTO tmpSource (fs1, fs2) ; VALUES (; 'F1' + PADR(TRANSFORM(m.i), 8, "0"), ; 'F2' + PADR(TRANSFORM(m.i), 8, "0")) ENDFOR INDEX ON fs1 TAG fs1 * * Create and populate cursor and list of explicit query values lcStrList = "" CREATE CURSOR tmpFilter (t1 C(10)) FOR i = 1 TO 10 lcQval = 'F1' + PADR(TRANSFORM(m.i * 100), 8, "0") * Populate cursor for sub-select INSERT INTO tmpFilter (t1) VALUES (m.lcQval) * Build list of explicit values lcStrList = m.lcStrList + ["] + m.lcQval + [",] ENDFOR lcStrList = RTRIM(m.lcStrList, 1, ",") * * Now, the test * From explicit list of (comma separated) values nSec = SECONDS() lcCmd = "SELECT * FROM tmpSource WHERE fs1 IN (" + m.lcStrList + ") INTO CURSOR tmp" &lcCmd ? TRANSFORM(SECONDS() - m.nsec) + " seconds to select " + TRANSFORM(RECCOUNT()) + " records - From (list)" * * From sub-select nSec = SECONDS() SELECT * FROM tmpSource WHERE fs1 IN (SELECT t1 FROM tmpFilter) INTO CURSOR tmp ? TRANSFORM(SECONDS() - m.nsec) + " seconds to select " + TRANSFORM(RECCOUNT()) + " records - From Sub-select" * USE IN tmp USE IN tmpSource USE IN tmpFilter