DB2 - Problem description
| Problem IC98964 | Status: Closed |
SCALAR SUBQUERIES ARE NOT PUSHED DOWN THROUGH UNION ALL LEADING TO POOR PERFORMANCE | |
| product: | |
DB2 FOR LUW / DB2FORLUW / A10 - DB2 | |
| Problem description: | |
When the following conditions are true, scalar subqueries will
not be pushed down through UNION ALL.
1. UNION ALL contains one or more correlated subqueries
2. UNION All view has a predicate referencing a SQL scalar UDF
3. The UDF has a function body that is a simple RETURN
fullselect
As an example please find following statement:
CREATE VIEW VIEW1 (EMPNO, DEPTNO, ISRESP) as (
SELECT A.EMPNO, A.WORKDEPT,
CASE WHEN NOT EXISTS ( SELECT 1 FROM project B WHERE A.EMPNO =
B.RESPEMP )
THEN 0
ELSE 1
END
AS ISRESP FROM employee A )
UNION ALL
SELECT MGRNO, ADMRDEPT, 0 FROM DEPARTMENT
and function used as predicate for EMPNO:
CREATE OR REPLACE FUNCTION SCALAR_FUNCTION ( EMPNO int )
RETURNS INTEGER
DETERMINISTIC CONTAINS SQL NO EXTERNAL ACTION
RETURN VALUES (
CASE WHEN EMPNO < 100
THEN EMPNO
ELSE 9999
END
)
Once you generate explain plan for the execution, you will
notice:
Access Plan:
-----------
Total Cost: 27.3384
Query Degree: 1
Rows
RETURN
( 1)
Cost
I/O
|
2.24
NLJOIN
( 2)
27.3384
4
/---+-------\
1 2.24
TBSCAN FILTER
( 3) ( 4)
1.6532e-005 13.7274
0 2
| |
1 56
TABFNC: SYSIBM UNION
GENROW ( 5)
13.7139
2
/-------+--------\
14 42
TBSCAN NLJOIN
( 6) ( 7)
6.81553 6.89572
1 1
| /----+-----\
14 42 1
TABLE: MBASTER TBSCAN TBSCAN
DEPARTMENT ( 8) ( 9)
Q1 6.82217 0.00690429
1 0
| |
42 0.47619
TABLE: MBASTER SORT
EMPLOYEE ( 10)
Q6 0.00667615
0
|
0.47619
IXSCAN
( 11)
0.00619229
0
|
20
INDEX: MBASTER
XPROJ2
Q3
Predicate on EMPNO is applied on FILTER 4:
Predicates:
----------
2) Residual Predicate,
Comparison Operator: Equal (=)
Subquery Input Required: No
Filter Factor: 0.04
Predicate Text:
--------------
(DECFLOAT(Q8.$C0, 34, '.') = Q10.$C0)
Presence of correlation:
CASE WHEN NOT EXISTS (
SELECT 1 FROM project B WHERE A.EMPNO = B.RESPEMP )
THEN 0
ELSE 1
END AS ISRESP FROM employee A )
prevents the scalar predicate push down through the UNION ALL. | |
| Problem Summary: | |
**************************************************************** * USERS AFFECTED: * * ALL * **************************************************************** * PROBLEM DESCRIPTION: * * See Error Description * **************************************************************** * RECOMMENDATION: * * Upgrade to DB2 version DB2 version 10.1 fixpack 5 * **************************************************************** | |
| Local Fix: | |
In order to workaround the problem, you need to remove VALUE
modifier from the function used as a predicate:
CREATE OR REPLACE FUNCTION NONSCALAR_FUNCTION (EMPNO int)
RETURNS INTEGER
DETERMINISTIC CONTAINS SQL NO EXTERNAL ACTION
RETURN ( CASE WHEN EMPNO < 100 THEN EMPNO ELSE 9999
END
);
Once you generate explain plan for the execution, you will
notice that predicate on EMPNO is applied on TBSCAN:
Predicates:
----------
3) Sargable Predicate,
Comparison Operator: Equal (=)
Subquery Input Required: No
Filter Factor: 0.04
Predicate Text:
--------------
(DECFLOAT(Q6.EMPNO, 34, '.') = 20)
Further, we can also apply additional predicate on IXSCAN due
to correlation A.EMPNO = B.RESPEMP :
Predicates:
----------
2) Sargable Predicate,
Comparison Operator: Equal (=)
Subquery Input Required: No
Filter Factor: 0.0228571
Predicate Text:
--------------
(DECFLOAT(Q1.MGRNO, 34, '.') = 20) | |
| Solution | |
Problem was first fixed in DB2 version 10.1 fixpack 5 | |
| Workaround | |
not known / see Local fix | |
| Comment | |
The suggested alternate behavior has been entered into IBM internal record wsdbu01234386. If you need further information, please contact IBM Support. | |
| BUG-Tracking | |
forerunner : APAR is sysrouted TO one or more of the following: IC99022 IC99023 IC99024 follow-up : | |
| Timestamps | |
Date - problem reported : Date - problem closed : Date - last modified : | 24.01.2014 28.07.2015 28.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 |
|