With select * from temp.dbf into cursor tmpRead readwrite you are really reading all data to a local cursor. And yes, working on that cursor is faster, as you don't work on the server dbf. Syncing back is easier, if you don't query this way, but via view or cursoradapter. These have the needed properties to define what to write back via which keys and more. The READWRITE clause does not allow to write back that easy, it merely allows changing the local cursor.
What you're doing with a readwrite cursor, view or cursoradapter is going in the route of 3 tier development, whereas binding forms/controls to a dbf is 2 tier design.
What's not going well in the long run is selecting all data, the missing part is a where clause limiting your data access. Actually 2 tier data binding to a grid can be faster than querying data, as the grid control itself is very clever in only reading as much, as it displays. So only scrolling makes VFP read more of a DBF. If you query READWRITE, that means all data matching the field list and where clause is read to local memory and/or TEMP dir. If you have a 100MB dbf that strategy is not working well.
And as you discovered already querying does not inherit indexes. That's also true for cursors created by view or cursoradapter. You may not need indexes, if the data loaded into cursors is just a small subset of all data, as is normally the case. In a product database you may want to search in all products, but the result is only what matches your search criteria, just as an example. God indexing of the server side dbfs is essential for fast querying into cursors and from then on you may only use them for sorting without requerying, for relating data in cursors and more. While Mike is right just needing data in one certain order you query with ORDER BY and the query will also make use of a server index, but if you want a grid with header click sorting of each column you also index your cursor data.
Cursors are what equals "the model" in many other development platforms, not only .NET, the model is the loaded data, it might also start empty and load by demand, so called lazy loading, only fetching things first, when really needed. That's an essential thought. If you apply that, it also doesn't matter if the server side has DBF files or a database server.
Bye, Olaf.