[Default] On Tue, 20 Nov 2007 09:56:11 +1100, James Steward
<[EMAIL PROTECTED]> wrote:

>Hi,
>
>I am new to SQL and SQLite, so please excuse me if I appear thick at
>times.
>
>I have an application that generates data from a moving vehicle.  At a
>position there may be 10s of pairs of data.  Position is given as an
>integer, and the data pairs are an integer and a float (real).  So I set
>up a database like this (in Tcl);
>
>db eval {CREATE TABLE position(\
>               position_id INTEGER PRIMARY_KEY, \
>               odo INTEGER, \
>               time CURRENT_TIMESTAMP);}
>db eval {CREATE TABLE data(\
>               data_id INTEGER PRIMARY_KEY, \
>               position_id INTEGER, \
>               x INTEGER, \
>               y REAL);}

Shouldn't that be PRIMARY KEY (without the underscore)?


>So far so good.  Now I have a heap of stored data in a binary file, that
>I use to insert into the tables, with statements like;
>
>db eval {BEGIN;}
>
># loop reading in file...
>while {..} {
>
>#when a new odo value is read...
>db eval {INSERT INTO position(odo) values($odo);} 
>set pos_id [db eval {SELECT last_insert_rowid();}]
>
>#for every data pair
>db eval {INSERT INTO data(position_id, x, y) values($pos_id, $x, $y);}
>
>}
>
>db eval {COMMIT;}
>
>There are no errors returned.  Now I try a couple of queries, which
>return data, but not quite what I expect.
>
>#This kinda works as expected, but position_id and time columns are not
>#poulated.  Why not?

That will have to do with the wrong spelling of PRIMARY KEY.

>db eval {SELECT * FROM position WHERE ROWID BETWEEN 100 AND 101;}
>
>#This does not work, returns nothing.  I thought (after reading the
>#SQLite doco) that position_id would be populated with ROWID...
>db eval {SELECT * FROM position WHERE position_id BETWEEN 100 AND 101;}
>
>#This kinda works, but data_id is not populated...
>db eval {SELECT * FROM data where position_id BETWEEN 100 AND 101;}
>
>#A more complicated query...runs quite slowly.  How can this be sped up?
>db eval {SELECT position.odo, data.x, data.y from position, data WHERE
>position.odo BETWEEN 10000 AND 10020;}

An index on position.odo might help.
Try that and compare the 'EXPLAIN SELECT ...' and 'EXPLAIN QUERY
PLAN SELECT ...'  output with and without index.

>Is SQLite going to be able to handle, say, 2,000,000 data pairs, and say
>60,000 positions, efficiently and quickly?

In general, yes.

>How can I help SQLite perform queries like the last above, as fast as
>possible?

Indexes and pragmas. More specifically, the page_size and
cache_size pragmas.

>Regards,
>James.

HTH
-- 
  (  Kees Nuyt
  )
c[_]

-----------------------------------------------------------------------------
To unsubscribe, send email to [EMAIL PROTECTED]
-----------------------------------------------------------------------------

Reply via email to