Thread: Question about Sql SELECT and optimizer

Question about Sql SELECT and optimizer

From
"Chaz."
Date:
I am trying to understand something I have seen happen. I had a select
that looked like:

select f(A) from A, B, C where g(A)

Where f(A) is the select that only depends on table A;
g(A) is the where part that only depends on table A.

What I saw happen was the optimizer will waste a lot of time (seconds!)
bringing in table B and C. I was wondering why doesn't the optimizer
drop references to tables B and C since they aren't used any where?

Peace and thanks in advance
Chuck Wegrzyn


Re: Question about Sql SELECT and optimizer

From
Michael Fuhr
Date:
On Thu, Mar 02, 2006 at 11:19:32AM -0500, Chaz. wrote:
> I am trying to understand something I have seen happen. I had a select
> that looked like:
> 
> select f(A) from A, B, C where g(A)
> 
> Where f(A) is the select that only depends on table A;
> g(A) is the where part that only depends on table A.
> 
> What I saw happen was the optimizer will waste a lot of time (seconds!)
> bringing in table B and C. I was wondering why doesn't the optimizer
> drop references to tables B and C since they aren't used any where?

The above query does a cross join.  Even though you're not using
values from B and C they're still contributing rows to the result
set.

test=> SELECT * FROM a;aid 
-----a1a2
(2 rows)

test=> SELECT * FROM b;bid 
-----b1b2
(2 rows)

test=> SELECT * FROM c;cid 
-----c1c2
(2 rows)

test=> SELECT a.*, b.*, c.* FROM a, b, c WHERE a.aid = 'a1';aid | bid | cid 
-----+-----+-----a1  | b1  | c1a1  | b2  | c1a1  | b1  | c2a1  | b2  | c2
(4 rows)

test=> SELECT a.*, b.* FROM a, b, c WHERE a.aid = 'a1';aid | bid 
-----+-----a1  | b1a1  | b2a1  | b1a1  | b2
(4 rows)

test=> SELECT a.* FROM a, b, c WHERE a.aid = 'a1';aid 
-----a1a1a1a1
(4 rows)

-- 
Michael Fuhr