On 2 Feb 2011, at 11:28pm, Dave White wrote:

> Our old selection method queries indexes and returns the equivalent of a list 
> of rowids that we then use to access records as needed. I've managed to mimic 
> this behavior but it is very slow. My select statement is something like 
> "Select rowid from T01 where ref_uid=100". I then step through all rows, read 
> in each rowid, assemble them into an array, and forward the array to a client 
> which will then request the records by rowid one at a time.

Is there really any point in doing this ?  If you feed your second operation 
like this:

SELECT thisCol, thatCol FROM T01 WHERE ref_uid=100

you can skip the first stage entirely.  However, it's possible that whatever 
your second operation is doing will interfere with the SELECT so ...

> This takes about 10x longer than our old selections. It appears to me that 
> this is happening because each step to the next row is paging in data so the 
> rowid can be read. I expected index trees would store rowids and make data 
> reads unnecessary, but this doesn't seem to be the case.

If you have an index on the ref_uid column, then the SQL operations involved in 
this won't take too long. However you can dramatically reduce the number of SQL 
operations for this particular operation using an aggregate function:

http://www.sqlite.org/lang_aggfunc.html

So try something like

SELECT group_concat(rowid) FROM T01 WHERE ref_uid=100

should return just one row, with all the rowids concatenated into one long 
string, separated by commas.

Note: I just thought up the above code, I haven't actually tested it.  You 
should.

Simon.
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to