Keith,

No SQL format can guarantee anything. And changing SQL format won't change
its execution plan - SQL optimizer will decide that for you. And I don't
know where did you take your information from but I can guarantee you that
with your query SQLite will execute strftime many times and OP's problem
will persist.

Pavel
On Jul 22, 2012 2:24 PM, "Keith Medcalf" <kmedc...@dessus.com> wrote:

> select a.name, a.assignedTo, a.validFrom
>   from aliases a,
>        (select name, max(validfrom) as mvf
>           from aliases,
>                (select strftime('%s', 'now') as now) as c
>          where validFrom <= now
>       group by name) as b
>  where a.name=b.name and a.validfrom=b.mvf;
>
> should also work.  I changed the syntax slightly:
> from a join b join c on a.x=b.y and b.z=c.p is just a different spelling
> of from a, b, c where a.x=b.y and b.z=c.p
> designed to make it clear (COBOL style) which clauses are join columns
> (ON) and which are row selectors (WHERE).  It should have zero effect on
> the actually query plan.
>
> Effectively, creates a temp table with a single row containing a single
> value now, which is used as a selector against the rows of aliases.  This
> format should guarantee that the strftime function is only ever executed
> once.
>
> sqlite> explain query plan select a.name, a.assignedTo, a.validFrom
>    ...>   from aliases a,
>    ...>        (select name, max(validfrom) as mvf
>    ...>           from aliases,
>    ...>                (select strftime('%s', 'now') as now) as c
>    ...>          where validFrom <= now
>    ...>       group by name) as b
>    ...>  where a.name=b.name and a.validfrom=b.mvf;
> SELECT item[0] = {0:0}
>        item[1] = {0:1}
>        item[2] = {0:2}
> FROM {0,*} = aliases (AS a)
>      {1,*} = SELECT agg_flag
>                 item[0] = AGG{2:0}
>                 item[1] = AGG_FUNCTION:max(AGG{2:2})
>              FROM {2,*} = aliases
>                   {3,*} = SELECT FUNCTION:strftime(item[0] = '%s'
>                                                    item[1] = 'now')
>                           END (tabname=sqlite_subquery_53E850_) (AS c)
>              WHERE LE({2:2},{3:0})
>              GROUPBY {2:0}
>              END (tabname=sqlite_subquery_53E4D0_) (AS b)
> WHERE AND(EQ({0:0},{1:0}),EQ({0:2},{1:1}))
> END
> sele  order          from  deta
> ----  -------------  ----  ----
> 1     0              1     SCAN SUBQUERY 2 AS c (~1 rows)
> 1     1              0     SCAN TABLE aliases (~333333 rows)
> 1     0              0     USE TEMP B-TREE FOR GROUP BY
> 0     0              1     SCAN SUBQUERY 1 AS b (~100 rows)
> 0     1              0     SEARCH TABLE aliases AS a USING AUTOMATIC
> COVERING INDEX (name=? AND validFrom=?) (~7 rows)
> sqlite>
>
> ---
> ()  ascii ribbon campaign against html e-mail
> /\  www.asciiribbon.org
>
>
>
>
> _______________________________________________
> 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