Thanks for the answer guys... I'm afraid this is going beyond my SQL 
knowledge, so I'll let Stephane come back with a better example (when he gets 
his internet back :p)

Guillaume

Le vendredi 1 juin 2012 09:30:06 Richard Hipp a écrit :
> On Fri, Jun 1, 2012 at 10:33 AM, Guillaume DE BURE <
> 
> 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
> > http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
-- 
Skrooge, a free, Open Source, personal finances software for linux, Mac OS, 
Windows
http://skrooge.org
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to