select sum(code_type == 'SET') as "#sets",
       sum(code_type == 'CST') as "#constants",
       sum(code_type == 'CMT') as #comments",
       sum(code_type == 'LOG') as "#logs"
  from keys;

will do a single table scan and return the sums in a single statement with no 
complications ...

-- 
˙uʍop-ǝpısdn sı ɹoʇıuoɯ ɹnoʎ 'sıɥʇ pɐǝɹ uɐɔ noʎ ɟı

> -----Original Message-----
> From: sqlite-users [mailto:sqlite-users-boun...@mailinglists.sqlite.org]
> On Behalf Of Dominique Devienne
> Sent: Thursday, 6 July, 2017 02:52
> To: General Discussion of SQLite Database
> Subject: [sqlite] Any way to avoid scanning a large table several times?
> 
> I have a view gathering statistics from 3 different tables, one of which
> is
> largish (~ 2M rows).
> 
> The view is similar to this:
> 
> with
> kcounts(t, c) as (
>   select code_type, count(*)
>    from keys
>   group by code_type
> ),
> ...
> select ...,
>        (select c from kcounts where t = 'SET') as "#sets",
>        (select c from kcounts where t = 'CST') as "#constants",
>        (select c from kcounts where t = 'CMT') as "#comments",
>        (select c from kcounts where t = 'LOG') as "#logs",
>        ...;
> 
> With all 4 counts, the views takes ~ 6.5s to compute its 1 row (with the
> file in cache, was 13.5s with a cold filesystem cache, while DB is only
> 380MB in size).
> 
> If I remove 3 of the lines, keeping a single "select c from kcounts where
> t
> = ..." that drops to 2.15s, or about one third. (this is inside SQLiteSpy
> using SQLite 3.13.0 BTW).
> 
> As a programmer, I can see this can be done in a single pass, but most
> likely the SQL as written does several passes over kcounts, despite using
> a
> CTE (I had hoped kcounts would be instantiated into an ephemeral table,
> and
> thus accessing a 4 row tables would be "free").
> 
> An explain query plan indeed shows 4x "SCAN TABLE keys" steps, not just 1.
> 
> Is there a way to reformulate this query differently to somehow achieve a
> single pass on the keys table? Or force the query planner to "instantiate"
> the kcounts "CTE view" to achieve that single scan, via some kind of hint?
> If none exists, could one such hint be added? Ideally the planner itself
> would decide kcounts should be instantiated, but I'm happy to tell him it
> should via a hint.
> 
> The speed up is non-negligible at 3x, thus my request for comments from
> experts on this.
> 
> Thanks, --DD
> 
> PS: BTW, I did run ANALYZE and that didn't change the plan or execution
> time.
> _______________________________________________
> sqlite-users mailing list
> sqlite-users@mailinglists.sqlite.org
> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users



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

Reply via email to