DB2 - Problem description
Problem IT17851 | Status: Closed |
AN SQL STATEMENT IN A PARTITIONED DATABASE ENV CONTAINING THE ROW_NUMBER() OVER() OPERATION MIGHT PRODUCE INCONSISTENT RESULTS | |
product: | |
DB2 FOR LUW / DB2FORLUW / A10 - DB2 | |
Problem description: | |
An sql statement in a partitioned database environment containing the ROW_NUMBER() OVER() operation might produce inconsistent results because the ROW_NUMBER() operation is processed in parallel on the individual partitions on the broadcasted result set. A example statement : select T1.BIGINT_ID, count(*) FROM ( SELECT VARCHAR_KEY, ROW_NUMBER() OVER() AS BIGINT_ID FROM ( SELECT DISTINCT VARCHAR_KEY FROM MYTABLE ) ) T1, MYTABLE T2 where T1.VARCHAR_KEY = T2.VARCHAR_KEY group by T1.BIGINT_ID having count(*) > 1 This will have an execution plan showing : 11141 BTQ ( 11) | 1856.83 MDTQ ( 12) Where the resultset is pushed out to all partitions via the BTQ operation and where the row_number() operator is applied. A simplified example data set : TQ11 receives all matching rows and it will be assigning the rank to all rows as it receives them. say TQ11 on partition 0 receives row a b c d, it will assign these row_number() / rank value : a rownum 1 b rownum 2 c rownum 3 d rownum 4 but partition 1 might receive the rows in a different order : c b a d so on partition 1 the assigned rownumbers are different a rownum 3 b rownum 2 c rownum 1 d rownum 4 hence when the data is then rejoined with the base table, the result might be a 1 b 2 c 1 d 4 with incorrect duplicate values for the rownumber() column. | |
Problem Summary: | |
**************************************************************** * USERS AFFECTED: * * ALL * **************************************************************** * PROBLEM DESCRIPTION: * * See Error Description * **************************************************************** * RECOMMENDATION: * * Upgrade to DB2 10.1 Fix Pack 6 * **************************************************************** | |
Local Fix: | |
If there is a unique column in the stream that row_number() over () runs on, then add the unique column into row_number: row_number() over (order by <unique-columns>) Example: SELECT VARCHAR_KEY, ROW_NUMBER() OVER (ORDER BY VARCHAR_KEY) + 1000000000 AS BIGINT_ID | |
Solution | |
First fixed in DB2 10.1 Fix Pack 6 | |
Workaround | |
not known / see Local fix | |
Timestamps | |
Date - problem reported : Date - problem closed : Date - last modified : | 08.11.2016 02.03.2017 02.03.2017 |
Problem solved at the following versions (IBM BugInfos) | |
Problem solved according to the fixlist(s) of the following version(s) |