news <[EMAIL PROTECTED]> wrote on 05/11/2005 09:09:36 AM:

> In article <[EMAIL PROTECTED]>,
> Peter Brawley <[EMAIL PROTECTED]> writes:
> 
> > Scott, sorry, my mistake,
> >   SELECT price
> >   FROM fedex_zones z
> >   INNER JOIN fedex_rates r ON z.zone=r.zone AND z.zip=94947
> >   WHERE r.weight = 25;
> > PB
> 
> Although correct, many people consider this bad style - the ON clause
> of the JOIN should contain only the join condition(s). So it would be
> better to say
> 
>   SELECT price
>   FROM fedex_zones z
>   JOIN fedex_rates r ON z.zone = r.zone
>   WHERE r.weight = 25
>     AND z.zip = 94947
> 
> 

I agree, in principle, with the comment about preferred style. However, 
certain combinations of ON conditions can trigger the use of different 
indexes by the optimizer based on the conditions being matched. The final 
query results may be the same but if you want the best possible 
performance out of your JOIN queries, sometimes you need to break the 
style rule.

I list two other "correct" if not properly styled ways of writing the same 
query below. Based on the optimizer and its choice of indexes used during 
the JOIN processing phase of their executions, these may have (slightly) 
different performance characteristics.

SELECT price
FROM fedex_zones z
JOIN fedex_rates r 
        ON z.zone = r.zone
        AND r.weight = 25
WHERE z.zip = 94947

SELECT price
FROM fedex_zones z
JOIN fedex_rates r 
        ON z.zone = r.zone
        AND r.weight = 25
        AND z.zip = 94947

As I stress, these should all produce the same results. The one that will 
perform "best" depends on both the data composition and the indexes on the 
tables. The EXPLAIN command will expose any differences in the execution 
plans for each of these queries. If none of them show a difference in 
their execution plans, then each of them is interchangeable for the other. 
That means that you cannot make a decision of which form to use based on 
performance. The form with the constant conditions in the WHERE clause 
(the one from the last post) would then be the preferred way of writing 
this query when performance is not an issue.

Shawn Green
Database Administrator
Unimin Corporation - Spruce Pine

Reply via email to