Hi Richard,

In fact, the real need is "common subexpression elimination".
As you can see in attached email, we already had this discussion.

To improve performances on SELECT in skrooge (see datamodel in test.sqlite), I created some tables (named vm_xxx) updated after each transaction through the corresponding view (named v_xxx).
This is a kind of "materialized view".

*Do you plan something around CSE?*

Thank you again for sqlite.

Regards,
Stephane


Le 01/06/2012 15:30, Richard Hipp a écrit :


On Fri, Jun 1, 2012 at 10:33 AM, Guillaume DE BURE <guillaume.deb...@gmail.com <mailto:guillaume.deb...@gmail.com>> wrote:

    Hi all,

    In Skrooge (http://skrooge.org), we use extensively views, and
    views based on
    views. However, it seems that in such a case, the linked views are
    computed
    several times. To better explain the issue, Stephane, our main
    developper,
    created a small use case, explaining the issue :

    CREATE TABLE t(x);
    INSERT INTO t (x) VALUES ('A');
    INSERT INTO t (x) VALUES ('B');
    INSERT INTO t (x) VALUES ('C');

    CREATE VIEW v_t1 AS SELECT x, random() as "Y" from t;
    CREATE VIEW v_t2 AS SELECT x, Y as "Y1", (Y+1) as "Y2" from v_t1;
    SELECT x, Y2-Y1 from v_t2;

           The result is:
           A|3495515542145967690
           B|-2850173736877580107
           C|5413870427642078391

           instead of
           A|1
           B|1
           C|1

           ==> WRONG RESULT


The query flattener converts

    SELECT x, Y2-Y1 FROM v_t2;

Into this:

    SELECT x, (random()+1)-random() FROM t;

Is that an invalid transformation? I'm not so sure. It would certainly run faster if T were a large table and there was a WHERE clause that could be indexed. And it is not difficult to come up with an example where the query flattener is a huge performance win. But in any event, if you turn off the query flattener, you get the "right" (or, I would say, "expected") answer. To see this, run the following script in the sqlite3.exe command-line shell:

CREATE TABLE t(x);
INSERT INTO t (x) VALUES ('A');
INSERT INTO t (x) VALUES ('B');
INSERT INTO t (x) VALUES ('C');
CREATE VIEW v_t1 AS SELECT x, random() as "Y" from t;
CREATE VIEW v_t2 AS SELECT x, Y as "Y1", (Y+1) as "Y2" from v_t1;
SELECT x, Y2-Y1 from v_t2;
.testctrl optimizations 1
SELECT x, Y2-Y1 FROM v_t2;

The query, you see, is run twice. The first time with query flattening enabled and the second time with it disabled. The second time gives the answer you were expecting.



    While the problem illustrated here leads to a wrong result, the
    real problem
    for us is on the perfo side : underlying views are recomputed
    several times
    for a top level view.


In the example above, the views are never computed at all - they are optimized out by the query flattener. Maybe you can come up with a better example to illustrate your problem?

Or are you asking for common subexpression elimination (CSE)?


    Do you think there is room for improvement here ? Does this sound
    feasible ?

    Thanks :)

    Guillaume


    --
    Skrooge, a free, Open Source, personal finances software for
    linux, Mac OS,
    Windows
    http://skrooge.org
    _______________________________________________
    sqlite-users mailing list
    sqlite-users@sqlite.org <mailto:sqlite-users@sqlite.org>
    http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users




--
D. Richard Hipp
d...@sqlite.org <mailto:d...@sqlite.org>
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to