DB2 - Problem description
Problem IC72326 | Status: Closed |
SQL1585N, SQLSTATE=54048 MAY OCCUR FOR EXTREMELY LONG SQL STATEMENTS WITH TOO MANY COLUMN EXPRESSIONS INVOLVED. | |
product: | |
DB2 FOR LUW / DB2FORLUW / 910 - DB2 | |
Problem description: | |
In some cases, the compilation of an extremely long SQL statement containing too many column expressions and predicates using parameter marker or host variable comparisons may result in an SQL1585N, SQLSTATE=54048 error. When parameter markers or host variables are used with a between predicate, such as "COL between :hv1 and :hv2" or "COL >= :hv1 and COL <= :hv2", the query rewrite phase will add a check to ensure that :hv1 <= :hv2. As a result of adding this condition, you may hit a limitation in the optimizer that results in the SQL1585N error. When constants are used instead of the parameter markers or host variables, we don't hit the limitation in the optimizer. This limitation may not always result in SQL1585N. You can identify if this check is added by collecting an EXPLAIN of the query and using the db2exfmt tool to examine the details. The following steps describes one method to collect this information: 1. db2 set current explain mode explain 2. db2 -tvf <file_containing_query> 3. db2 set current explain mode no 4. db2exfmt -d <database_name> -1 -g -o <output_filename> In the output_filename file, under the "Optimized Statement" section, the following indicates that this condition was added: (SELECT Q1.$C0 FROM (VALUES 0) AS Q1 WHERE (:? <= :? SELECTIVITY 1.000000)) AS Q2 and the "Access Plan" will include operators similar to the following: 0.0111111 NLJOIN ( 4) 1455.04 192.4 /-------+-------\ 1 0.0111111 TBSCAN FILTER ( 5) ( 6) 9.563e-05 896.185 0 118.483 | | 1 ... TABFNC: SYSIBM GENROW Q1 The hv1<=hv2 condition is one example where this limitation applies. This fix addresses the general limitation in the optimizer where the query contains SELECT Q1.$C0 FROM (VALUES 0) AS Q1 The fix for this APAR is enabled by setting the DB2_EXTENDED_OPTIMIZATION registry variable, and there are two parts to it. It can be enabled using any of the following: 1. To enable both parts: db2set DB2_EXTENDED_OPTIMIZATION=NLJNORD,NO_HVCHECK_ALL 2. To enable one portion of the change: db2set DB2_EXTENDED_OPTIMIZATION=NLJNORD db2set DB2_EXTENDED_OPTIMIZATION=NO_HVCHECK_ALL Note: if you already have DB2_EXTENDED_OPTIMIZATION set, then you will need to include it when setting this new keywords; for example, db2set DB2_EXTENDED_OPTIMIZATION=YES,NLJNORD,NO_HVCHECK_ALL The "NLJNORD" value enables the optimizer improvement. The "NO_HVCHECK_ALL" value disables the injection of the :hv1 <= :hv2 condition, resulting in the same behavior as when the user supplies constants instead of host variables or parameter markers. | |
Problem Summary: | |
Problem Description: SQL1585N, SQLSTATE=54048 MAY OCCUR FOR EXTREMELY LONG SQL STATEMENTS WITH TOO MANY COLUMN EXPRESSIONS INVOLVED. Problem Summary: In some cases, the compilation of an extremely long SQL statement containing too many column expressions and predicates using parameter marker or host variable comparisons may result in an SQL1585N, SQLSTATE=54048 error. When parameter markers or host variables are used with a between predicate, such as "COL between :hv1 and :hv2" or "COL >= :hv1 and COL <= :hv2", the query rewrite phase will add a check to ensure that :hv1 <= :hv2. As a result of adding this condition, you may hit a limitation in the optimizer that results in the SQL1585N error. When constants are used instead of the parameter markers or host variables, we don't hit the limitation in the optimizer. This limitation may not always result in SQL1585N. You can identify if this check is added by collecting an EXPLAIN of the query and using the db2exfmt tool to examine the details. The following steps describes one method to collect this information: 1. db2 set current explain mode explain 2. db2 -tvf <file_containing_query> 3. db2 set current explain mode no 4. db2exfmt -d <database_name> -1 -g -o <output_filename> In the output_filename file, under the "Optimized Statement" section, the following indicates that this condition was added: (SELECT Q1.$C0 FROM (VALUES 0) AS Q1 WHERE (:? <= :? SELECTIVITY 1.000000)) AS Q2 and the "Access Plan" will include operators similar to the following: 0.0111111 NLJOIN ( 4) 1455.04 192.4 /-------+-------\ 1 0.0111111 TBSCAN FILTER ( 5) ( 6) 9.563e-05 896.185 0 118.483 | | 1 ... TABFNC: SYSIBM GENROW Q1 The hv1<=hv2 condition is one example where this limitation applies. This fix addresses the general limitation in the optimizer where the query contains SELECT Q1.$C0 FROM (VALUES 0) AS Q1 The fix for this APAR is enabled by setting the DB2_EXTENDED_OPTIMIZATION registry variable, and there are two parts to it. It can be enabled using any of the following: 1. To enable both parts: db2set DB2_EXTENDED_OPTIMIZATION=NLJNORD,NO_HVCHECK_ALL 2. To enable one portion of the change: db2set DB2_EXTENDED_OPTIMIZATION=NLJNORD db2set DB2_EXTENDED_OPTIMIZATION=NO_HVCHECK_ALL Note: if you already have DB2_EXTENDED_OPTIMIZATION set, then you will need to include it when setting this new keywords; for example, db2set DB2_EXTENDED_OPTIMIZATION=YES,NLJNORD,NO_HVCHECK_ALL The "NLJNORD" value enables the optimizer improvement. The "NO_HVCHECK_ALL" value disables the injection of the :hv1 <= :hv2 condition, resulting in the same behavior as when the user supplies constants instead of host variables or parameter markers. | |
Local Fix: | |
Users could try replacing the parameter markers or host variables with constants, or use REOPT ALWAYS. Users could also try to change the optimization level since it may cause the optimizer to choose a different plan that may satisfy the order earlier and thus avoid SQL1585N. | |
available fix packs: | |
DB2 Version 9.1 Fix Pack 10 for Linux, UNIX and Windows | |
Solution | |
Problem is first fixed in Version 9.1 Fix Pack 10 | |
Workaround | |
Users could try replacing the parameter markers or host variables with constants, or use REOPT ALWAYS. Users could also try to change the optimization level since it may cause the optimizer to choose a different plan that may satisfy the order earlier and thus avoid SQL1585N. | |
Timestamps | |
Date - problem reported : Date - problem closed : Date - last modified : | 02.11.2010 13.06.2011 13.06.2011 |
Problem solved at the following versions (IBM BugInfos) | |
9.1.FP10 | |
Problem solved according to the fixlist(s) of the following version(s) | |
9.1.0.10 |