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 >Sub-selects are slow by definition. You may use EXISTS instead and see if the performance improves.