query plan and parenthesis

Started by Jan Poslusnyalmost 23 years ago5 messagesgeneral
Jump to latest
#1Jan Poslusny
pajout@gingerall.cz

Hi,
I have following view definition given by '\d' command: SELECT t1.col1
FROM ((table1 t1 JOIN table2 t2 ON ((t1.id = t2.id))) JOIN table3 t3 ON
((t2.some = t3.some)));
Is query planner able to optimize order of joining (t1, t2), t3 or must
join with order described by parenthesis ? This is very important for
joining small (50 rows) and huge (5M rows) tables.

#2Christoph Haller
ch@rodos.fzk.de
In reply to: Jan Poslusny (#1)
Re: query plan and parenthesis

I have following view definition given by '\d' command: SELECT t1.col1

FROM ((table1 t1 JOIN table2 t2 ON ((t1.id = t2.id))) JOIN table3 t3

ON

((t2.some = t3.some)));
Is query planner able to optimize order of joining (t1, t2), t3 or

must

join with order described by parenthesis ? This is very important for
joining small (50 rows) and huge (5M rows) tables.

The postgresql-7.3.2 documentation says:
Finally, a FROM item can be a JOIN clause, which combines two simpler
FROM items.
(Use parentheses if necessary to determine the order of nesting.)
So, I say, anyway if the planner is able to or not, if you know in
advance what order of
nesting is optimal, use parentheses.
On the other hand, after doing a VACUUM, you can always do an EXPLAIN to
see
how the planner will act.
Regards, Christoph

#3Jan Poslusny
pajout@gingerall.cz
In reply to: Christoph Haller (#2)
Re: query plan and parenthesis

Thanks for answer, but:
I did not want to determine the order of nesting, so I wrote something
like CREATE VIEW myview AS SELECT ... FROM t1 INNER JOIN t2 ON ... INNER
JOIN t3 ON ... ; - without parenthesis
When I read output of '\d myview', I found parenthesis.
I think I must set some appropriate nesting order when I am defining the
view - optimizer are not able to resolve it from internally stored
definition.

regards, jan

Christoph Haller wrote:

Show quoted text

I have following view definition given by '\d' command: SELECT t1.col1

FROM ((table1 t1 JOIN table2 t2 ON ((t1.id = t2.id))) JOIN table3 t3

ON

((t2.some = t3.some)));
Is query planner able to optimize order of joining (t1, t2), t3 or

must

join with order described by parenthesis ? This is very important for
joining small (50 rows) and huge (5M rows) tables.

The postgresql-7.3.2 documentation says:
Finally, a FROM item can be a JOIN clause, which combines two simpler
FROM items.
(Use parentheses if necessary to determine the order of nesting.)
So, I say, anyway if the planner is able to or not, if you know in
advance what order of
nesting is optimal, use parentheses.
On the other hand, after doing a VACUUM, you can always do an EXPLAIN to
see
how the planner will act.
Regards, Christoph

#4Christoph Haller
ch@rodos.fzk.de
In reply to: Jan Poslusny (#3)
Re: query plan and parenthesis

Thanks for answer, but:
I did not want to determine the order of nesting, so I wrote something

like CREATE VIEW myview AS SELECT ... FROM t1 INNER JOIN t2 ON ...

INNER

JOIN t3 ON ... ; - without parenthesis
When I read output of '\d myview', I found parenthesis.

I see.

I think I must set some appropriate nesting order when I am defining

the

view - optimizer are not able to resolve it from internally stored
definition.

Another thought:
There has been recently a discussion on the hackers list about
unnecessary
parenthesesing while storing view definitions. The conclusion was it's
far too
error prone to start something like that. Because indeed there is no win
at all
regarding query execution in defining a view, you may consider skip the
definition
and leave it to the optimizer when preparing the original query.
Regards, Christoph

#5Tom Lane
tgl@sss.pgh.pa.us
In reply to: Jan Poslusny (#1)
Re: query plan and parenthesis

Jan Poslusny <pajout@gingerall.cz> writes:

I have following view definition given by '\d' command: SELECT t1.col1
FROM ((table1 t1 JOIN table2 t2 ON ((t1.id = t2.id))) JOIN table3 t3 ON
((t2.some = t3.some)));
Is query planner able to optimize order of joining (t1, t2), t3 or must
join with order described by parenthesis ? This is very important for
joining small (50 rows) and huge (5M rows) tables.

See
http://www.postgresql.org/docs/view.php?version=7.3&amp;idoc=0&amp;file=explicit-joins.html
and the same page updated for 7.4:
http://developer.postgresql.org/docs/postgres/explicit-joins.html

The discussion here seems to have gone off on a tangent: adding or
leaving out explicit parentheses *does not* affect what the planner will
do with a JOIN construct, it only makes it perfectly clear to both you
and the machine what the nesting order is. If you leave out parentheses
then the joins nest left-to-right, but this is not semantically
different from having written the same thing with parentheses,
eg, (A JOIN B ...) JOIN C ...

regards, tom lane