Would it not be more efficient to say:

select 1 from t1 limit 1;

?

> -----Original Message-----
> From: sqlite-users-bounces at mailinglists.sqlite.org [mailto:sqlite-users-
> bounces at mailinglists.sqlite.org] On Behalf Of Kirill M?ller
> Sent: Thursday, 26 November, 2015 15:03
> To: SQLite mailing list
> Subject: Re: [sqlite] Query flattening for left joins involving subqueries
> on the right-hand side
> 
> On 26.11.2015 21:12, Clemens Ladisch wrote:
> > Kirill M?ller wrote:
> >> On 25.11.2015 16:32, Clemens Ladisch wrote:
> >>> Kirill M?ller wrote:
> >>>> For a left join with a subquery on the right-hand side, that subquery
> >>>> doesn't seem to be flattened.
> >>> This is rule 3 of <http://www.sqlite.org/optoverview.html#flattening>.
> >> I wonder if this rule might be relaxed a bit.
> > Only if you relax your requirement that the results must be correct.
> >
> >
> > In the general case, a left outer join can be rewritten like this:
> >
> >    SELECT ... FROM A JOIN B ON ...
> >    UNION ALL
> >    SELECT ... FROM A WHERE NOT EXISTS (look up in B)
> >
> > This query would be more likely to be flattenable, but also be slower.
> >
> Thanks. Let's not focus on terminology -- I thought "flattening" was the
> right word to use, but it probably isn't. Of course I'm looking for
> correct results.
> 
> Originally, I attached a script but it seems that it's been stripped.
> I've pasted it below. I see no reason why the following two queries (1
> and 3 in the script) can't be executed with the same plans:
> 
> SELECT count(*) FROM (SELECT * FROM t1 LEFT JOIN t2 USING (a) LIMIT 1)
> SELECT count(*) FROM (SELECT * FROM t1 LEFT JOIN (SELECT * FROM t2) zzz2
> USING (a) LIMIT 1)
> 
> This is for two tables t1 and t2 with a single column "a". The script
> creates them and populates them with 200000 rows each.
> 
> 
> -Kirill
> 
> 
> #!/bin/bash
> 
> db=test.sqlite
> 
> #if false; then
> rm -f $db
> 
> n=200000
> 
> sqlite3 $db "CREATE TABLE t1 (a int primary key)"
> seq 1 $n | sqlite3 $db ".import /dev/stdin t1"
> 
> sqlite3 $db "CREATE TABLE t2 (a int primary key)"
> seq 1 $n | sqlite3 $db ".import /dev/stdin t2"
> #fi
> 
> q() {
>      sqlite3 $db "EXPLAIN QUERY PLAN $1"
>      time sqlite3 $db "$1"
> }
> 
> q "SELECT count(*) FROM (SELECT * FROM t1 LEFT JOIN t2 USING (a) LIMIT 1)"
> q "SELECT count(*) FROM (SELECT * FROM (SELECT * FROM t1) zzz1 LEFT JOIN
> t2 USING (a) LIMIT 1)"
> q "SELECT count(*) FROM (SELECT * FROM t1 LEFT JOIN (SELECT * FROM t2)
> zzz2 USING (a) LIMIT 1)"
> q "SELECT count(*) FROM (SELECT * FROM t1 INNER JOIN (SELECT * FROM t2)
> zzz2 USING (a) LIMIT 1)"
> 
> _______________________________________________
> sqlite-users mailing list
> sqlite-users at mailinglists.sqlite.org
> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users



Reply via email to