For 100 records in buffer: NONE Buffering False 0.002000 Buffering True 0.001000 For 100 records in buffer: ALL Buffering False 0.002000 Buffering True 0.131000 For 200 records in buffer: NONE Buffering False 0.003000 Buffering True 0.003000 For 200 records in buffer: ALL Buffering False 0.007000 Buffering True 0.662000 For 400 records in buffer: NONE Buffering False 0.006000 Buffering True 0.005000 For 400 records in buffer: ALL Buffering False 0.005000 Buffering True 2.594000 For 800 records in buffer: NONE Buffering False 0.010000 Buffering True 0.010000 For 800 records in buffer: ALL Buffering False 0.011000 Buffering True 9.751000 For 1600 records in buffer: NONE Buffering False 0.019000 Buffering True 0.021000 For 1600 records in buffer: ALL Buffering False 0.016000 Buffering True 40.074000 For 3200 records in buffer: NONE Buffering False 0.036000 Buffering True 0.037000 For 3200 records in buffer: ALL Buffering False 0.035000 Buffering True 205.966000 For 6400 records in buffer: NONE Buffering False 0.077000 Buffering True 0.070000 For 6400 records in buffer: ALL Buffering False 0.075000 Buffering True 720.786000>>I think we need to work with my colleague on a different algorithm. I do, of course, appreciate some input on the problem from MS or from Fabio, but our experiments proved BUFFERING = .T. to be a culprit.
>CLEAR > >CREATE CURSOR testbuffering (pk i autoincr, field1 L) >FOR k=1 TO 50 > INSERT INTO (ALIAS()) ( field1 ) VALUES (.F. ) >NEXT > >* build an index is useless >* INDEX ON PK TAG TPK > >FOR k=1 TO 4 > INSERT INTO (ALIAS()) (field1) SELECT .f. FROM ALIAS() > testtime() >NEXT > >PROCEDURE testtime() > >CURSORSETPROP("Buffering",5) > >* allocate memory >test(.f.) > >? RECCOUNT(),"records in buffer: NONE"," buffering False" at 40, test(.F.) at 60, " True" at 80, test(.T.) at 90 > >REPLACE all field1 WITH field1 > >? RECCOUNT(),"records in buffer: ALL"," buffering False" at 40, test(.F.) at 60, " True" at 80, test(.T.) at 90 > >TABLEREVERT(.T.) >CURSORSETPROP("Buffering",1) > >PROCEDURE test(buffering) > t1=SECONDS() > SELECT COUNT(*) FROM testbuffering T1 ; > JOIN testbuffering T2 with (buffering=M.buffering); > ON T1.PK=T2.PK; > INTO ARRAY ASELECT > RETURN SECONDS()-T1 >