select * from foo
where rowid  =
        (select rowid from foo
        where parent_id = 1
        and child_id =  2
        group by parent_id, child_id
        having revision = max(revision))

sqlite> explain query plan
   ...> select * from foo
   ...> where rowid  =
   ...>         (select rowid from foo
   ...>         where parent_id = 1
   ...>         and child_id =  2
   ...>         group by parent_id, child_id
   ...>         having revision = max(revision))
   ...> ;
order|from|detail
0|0|TABLE foo USING PRIMARY KEY
0|0|TABLE foo WITH INDEX FOO_IDX1 ORDER BY


Would the above be faster due to the use of the PRIMARY key access ?

Regards,
Ken



Dennis Cote <[EMAIL PROTECTED]> wrote: John Elrick wrote:
> I have a question for the SQLite experts here as to the most efficient 
> way to retrieve the following:
> 
> Say we have a table:
> 
> CREATE TABLE FOO (
>   PARENT_ID INTEGER,
>   CHILD_ID INTEGER,
>   REVISION INTEGER
> );
> 
> CREATE UNIQUE INDEX FOO_IDX1 ON FOO (PARENT_ID,CHILD_ID,REVISION);
> 
> note that we could use
> 
> CREATE UNIQUE INDEX FOO_IDX1 ON FOO (PARENT_ID,CHILD_ID,REVISION DESC);
> 
> however, the current documentation implies that DESC does not improve 
> performance in the below.
> 
> If we have the following data:
> 
> INSERT INTO FOO VALUES (1,2,1);
> INSERT INTO FOO VALUES (1,2,2);
> INSERT INTO FOO VALUES (1,2,3);
> 
> My goal is two fold.
> 
> 1.  Given a parent_id and a child_id, retrieve the last rowid
> 
> select max(rowid) from foo where parent_id = :parentId and child_id = 
> :childId
> 

John,

Do you mean the last rowid, or do you really mean the last revision?

If you mean the latter then this should do it.

select * from foo
where parent_id = :parentId
and child_id = :childId
and revision =
 (select max(revision) from foo
 where parentId = :parentId
 and child_id = :childId)

> 2.  Given a parent_id, a child_id, and a revision, retrieve the last 
> rowid before that revision:
> 
> select max(rowid) from foo where parent_id = :parentId and child_id = 
> :childId and revision < :revision
> 

Similarly, for the second case.

select * from foo
where parent_id = :parentId
and child_id = :childId
and revision =
 (select max(revision) from foo
 where parentId = :parentId
 and child_id = :childId
 and revision < :revision)

You need to be careful not to assume any particular ordering of the rows 
in the table.

> My concern is that the queries above are suboptimal and will become a 
> performance impediment to the application.  Can anyone recommend a more 
> efficient method of retrieving the data?
> 

What makes you think these queries are sub-optimal? They will both use 
the index to find the correct revision number, and then use the index to 
find the matching row.

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



Dennis Cote <[EMAIL PROTECTED]> wrote: John Elrick wrote:
> I have a question for the SQLite experts here as to the most efficient 
> way to retrieve the following:
> 
> Say we have a table:
> 
> CREATE TABLE FOO (
>   PARENT_ID INTEGER,
>   CHILD_ID INTEGER,
>   REVISION INTEGER
> );
> 
> CREATE UNIQUE INDEX FOO_IDX1 ON FOO (PARENT_ID,CHILD_ID,REVISION);
> 
> note that we could use
> 
> CREATE UNIQUE INDEX FOO_IDX1 ON FOO (PARENT_ID,CHILD_ID,REVISION DESC);
> 
> however, the current documentation implies that DESC does not improve 
> performance in the below.
> 
> If we have the following data:
> 
> INSERT INTO FOO VALUES (1,2,1);
> INSERT INTO FOO VALUES (1,2,2);
> INSERT INTO FOO VALUES (1,2,3);
> 
> My goal is two fold.
> 
> 1.  Given a parent_id and a child_id, retrieve the last rowid
> 
> select max(rowid) from foo where parent_id = :parentId and child_id = 
> :childId
> 

John,

Do you mean the last rowid, or do you really mean the last revision?

If you mean the latter then this should do it.

select * from foo
where parent_id = :parentId
and child_id = :childId
and revision =
 (select max(revision) from foo
 where parentId = :parentId
 and child_id = :childId)

> 2.  Given a parent_id, a child_id, and a revision, retrieve the last 
> rowid before that revision:
> 
> select max(rowid) from foo where parent_id = :parentId and child_id = 
> :childId and revision < :revision
> 

Similarly, for the second case.

select * from foo
where parent_id = :parentId
and child_id = :childId
and revision =
 (select max(revision) from foo
 where parentId = :parentId
 and child_id = :childId
 and revision < :revision)

You need to be careful not to assume any particular ordering of the rows 
in the table.

> My concern is that the queries above are suboptimal and will become a 
> performance impediment to the application.  Can anyone recommend a more 
> efficient method of retrieving the data?
> 

What makes you think these queries are sub-optimal? They will both use 
the index to find the correct revision number, and then use the index to 
find the matching row.

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



Dennis Cote <[EMAIL PROTECTED]> wrote: John Elrick wrote:
> I have a question for the SQLite experts here as to the most efficient 
> way to retrieve the following:
> 
> Say we have a table:
> 
> CREATE TABLE FOO (
>   PARENT_ID INTEGER,
>   CHILD_ID INTEGER,
>   REVISION INTEGER
> );
> 
> CREATE UNIQUE INDEX FOO_IDX1 ON FOO (PARENT_ID,CHILD_ID,REVISION);
> 
> note that we could use
> 
> CREATE UNIQUE INDEX FOO_IDX1 ON FOO (PARENT_ID,CHILD_ID,REVISION DESC);
> 
> however, the current documentation implies that DESC does not improve 
> performance in the below.
> 
> If we have the following data:
> 
> INSERT INTO FOO VALUES (1,2,1);
> INSERT INTO FOO VALUES (1,2,2);
> INSERT INTO FOO VALUES (1,2,3);
> 
> My goal is two fold.
> 
> 1.  Given a parent_id and a child_id, retrieve the last rowid
> 
> select max(rowid) from foo where parent_id = :parentId and child_id = 
> :childId
> 

John,

Do you mean the last rowid, or do you really mean the last revision?

If you mean the latter then this should do it.

select * from foo
where parent_id = :parentId
and child_id = :childId
and revision =
 (select max(revision) from foo
 where parentId = :parentId
 and child_id = :childId)

> 2.  Given a parent_id, a child_id, and a revision, retrieve the last 
> rowid before that revision:
> 
> select max(rowid) from foo where parent_id = :parentId and child_id = 
> :childId and revision < :revision
> 

Similarly, for the second case.

select * from foo
where parent_id = :parentId
and child_id = :childId
and revision =
 (select max(revision) from foo
 where parentId = :parentId
 and child_id = :childId
 and revision < :revision)

You need to be careful not to assume any particular ordering of the rows 
in the table.

> My concern is that the queries above are suboptimal and will become a 
> performance impediment to the application.  Can anyone recommend a more 
> efficient method of retrieving the data?
> 

What makes you think these queries are sub-optimal? They will both use 
the index to find the correct revision number, and then use the index to 
find the matching row.

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

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

Reply via email to