fhg
Volume 9, Number 3 -- January 21, 2009

Redundant Join Criteria: Good or Bad Idea?

Published: January 21, 2009

Hey, Ted:

Suppose I have four tables that I commonly join. Is there any benefit to adding redundant criteria to the join? Or to the "where" clause? That is, will redundant criteria or selection expressions improve performance?

--Philip


Philip's four tables are keyed as follows:

SITE     ITEM      PROCESS   STRUCTURE
------   ------    --------  ---------
SiteID   SiteID    SiteID    SiteID
         ItemID    ItemID    ItemID
         Revision  Revision  Revision
                             StructID

Here's a join without redundant join criteria:

select whatever
from site as s
join item as i 
  on s.siteid = i.siteid
join process as p
  on i.siteid = p.siteid
 and i.itemid = p.itemid
 and i.rev    = p.rev
join structure as st
  on p.siteid = st.siteid
 and p.itemid = st.itemid
 and p.rev    = st.rev

Site joins to item, item joins to process, process joins to structure.

Here's the same join with redundant join criteria (in red).

select whatever
from site as s
join item as i 
  on s.siteid = i.siteid
join process as p
  on s.siteid = p.siteid
 and i.siteid = p.siteid
 and i.itemid = p.itemid
 and i.rev    = p.rev
join structure as st
  on s.siteid = st.siteid
 and i.siteid = st.siteid
 and i.itemid = st.itemid
 and i.rev    = st.rev
 and p.siteid = st.siteid
 and p.itemid = st.itemid
 and p.rev    = st.rev

The same joins are defined as before, but there are additional joins from site to process, from site to structure, and from item to structure.

Here's a similar query, with redundant record selection expressions (in red).

select whatever
  from item as i 
  join process as p
    on i.siteid = p.siteid
   and i.itemid = p.itemid
   and i.rev    = p.rev
  join structure as st
    on p.siteid = st.siteid
   and p.itemid = st.itemid
   and p.rev    = st.rev
 where i.itemid = 'ABC123'
   and p.itemid = 'ABC123'
   and st.itemid = 'ABC123'

Whereas selecting the itemID from the item table is sufficient for selecting the desired data set, the query also selects the same item from the process and structure tables.

I didn't know the answer to Philip's questions, so I directed them to Dan Cruikshank of IBM, who was kind enough to respond. According to him, both the Classic Query Engine (CQE) and the SQL Query Engine (SQL) generate selection predicates over join columns, so the answer to the second question, regarding redundant record selection expressions, is no. The optimizers will generate the where predicates in red.

The answer to the first question depends on the optimizer. The SQE optimizer understands transitive closure. That is, it knows that if A equals B and B equals C, then A equals C. The SQE will add join predicates as part of the greedy join process for inner joins. The SQE optimizer does add the join predicates shown in red above. I infer that redundant join criteria may help with queries that the CQE processes.

--Ted




Copyright © 1996-2009 Guild Companies, Inc. All Rights Reserved.
Guild Companies, Inc., 50 Park Terrace East, Suite 8F, New York, NY 10034

Privacy Statement