DB2 - Problem description
Problem IT05401 | Status: Closed |
IN A RARE CONDITION, A QUERY OF A CHAIN OF EQUALITY JOIN PREDICATES BETWEEN 4 OR MORE TABLES COULD PRODUCE EXTRA ROWS | |
product: | |
DB2 FOR LUW / DB2FORLUW / A10 - DB2 | |
Problem description: | |
This problem deals with inner joins between 4 or more tables and an outer join. For a chain of join predicates between 4 columns, we need to apply at least 3 join predicates among the 4 columns. This APAR documents a case where only 2 join predicates are applied and a redundant predicate is incorrectly picked up. Assume we have tables A, B, C, D and X with the definitions shown in the following SQL: set schema test; create table A(a1 int, a2 varchar(12)); create table B(b1 int, b2 varchar(12)); create table C(c1 int, c2 varchar(12)); create table D(d1 int, d2 varchar(12)); create table X(x1 int, x2 varchar(12)); An example of this problem is illustrated by the following SQL: select a2, b2, c2, d2 from c inner join d on c2=d2 left join x on c1=x1 inner join a on c2=a2 inner join b on a1=b1 and d2=b2 ; If DB2 chooses an access plan with the following join order: ( ( C inner join D ) outer join X ) ... [1] inner join ... [2] ( A inner join B ) ... [3] and the inner join in [2] is a hash join. The order of [1] and [3] may be swapped, that is, either [1] HSJOIN [3], or [3] HSJOIN [1] could trigger the problem. A sample data and small twist on the statistic in the SQL below demonstrate the result of those extra rows. insert into C values (1, '1'); insert into D values (1, '1'); insert into A values (1, '1'); insert into B values (1, '1'); insert into B values (1, 'extra row'); insert into B values (1, 'extra row'); runstats on table test.A; runstats on table test.B; runstats on table test.C; runstats on table test.D; runstats on table test.X; -- To influence the optimizer to join A and B first update sysstat.columns set colcard=3 where tabschema='TEST' and tabname='B' and colname='B1'; Then, the 2 "extra row"s of B are returned in the result set because the join predicate d2=b2 is incorrectly picked to be the redundant predicate and by not applying it. A2 B2 C2 D2 ------------ ------------ ------------ ------------ 1 1 1 1 1 extra row 1 1 1 extra row 1 1 3 record(s) selected. | |
Problem Summary: | |
**************************************************************** * USERS AFFECTED: * * All users * **************************************************************** * PROBLEM DESCRIPTION: * * See Error Description * **************************************************************** * RECOMMENDATION: * * Upgrade to DB2 version 10.1.0.5. * **************************************************************** | |
Local Fix: | |
Setting the optimization level to 3, 1 or 0 as the command "db2 set current query optimization 3" could avoid the problem. | |
Solution | |
The problem is first fixed in DB2 version 10.1.0.5. | |
Workaround | |
not known / see Local fix | |
Timestamps | |
Date - problem reported : Date - problem closed : Date - last modified : | 06.11.2014 10.07.2015 10.07.2015 |
Problem solved at the following versions (IBM BugInfos) | |
Problem solved according to the fixlist(s) of the following version(s) | |
10.1.0.5 | |
10.5.0.5 |