Quote:
Originally posted by Marcus_A
You say that you have two versions of the SQL statement. Please post them exactly, with host variables or literals and they occur in the SQL statement.
Sometimes DB2 will need to materialize the answer set in the temporary tablespace (into a table which is hidden to you) before the first row is fetched into your program. This can happen with an ORDER BY or other clause where DB2 needs to read all of the rows before the first one is returned. This "might be" the explanation, but it is difficult to understand why the static statement would do this, and not the dynamic version, without seeing the two SQL statements.
Also, in accordance with posting rules, please provide DB2 version (and fixpak level) and OS.
|
Marcus_A,
Thx for your help.
We are using DB2 v8.1/AIX with FP2.
Pls. find below the Static and Dynamic SQL:
Static SQL
------------
SELECT MCID, MID, ICPRF1, ICPRF2, ICNUM, CHAR(DTCLEAR, ISO),
TMMRCLEAR, CHAR(DTTRAN, ISO), LOCID, TERMNO, UIDTX,
TRANID, TRANSPID , POEDEST, ICMRST, CNTRTY, TARHITIND,
SYNBATCHNO, CHAR(TMTRAN, ISO), PGRCD, CNLREA, CNLRMK,
TMSTMPLSTUPD, SAERRIND
FROM WICMRD
WHERE (TMSTMPLSTUPD > :H00027 ) OR (TMSTMPLSTUPD = :H00027 AND
MCID > :H00028 ) OR (TMSTMPLSTUPD = :H00027 AND MCID =
:H00028 AND MID > :H00029 )
ORDER BY TMSTMPLSTUPD, MCID, MID
OPTIMIZE
FOR 1 ROWS
Explain Plan for Static SQL
-------------------------------
Estimated Cost = 162144.656250
Estimated Cardinality = 100254.265625
Access Table Name = DB2ICA.LICMRD ID = 7,4
| #Columns = 24
| Index Scan: Name = DB2ICA.XICMRD2 ID = 4
| | Regular Index (Not Clustered)
| | Index Columns:
| | | 1: TMSTMPLSTUPD (Ascending)
| | | 2: MCID (Ascending)
| | | 3: MID (Ascending)
| | #Key Columns = 0
| | | Start Key: Beginning of Index
| | | Stop Key: End of Index
| | Data Prefetch: None
| | Index Prefetch: None
| | Sargable Index Predicate(s)
| | | #Predicates = 6
| Lock Intents
| | Table: Intent Share
| | Row : Next Key Share
Return Data to Application
| #Columns = 24
End of section
Dynamic SQL
----------------
SELECT MCID, MID, ICPRF1, ICPRF2, ICNUM, CHAR(DTCLEAR, ISO),
TMMRCLEAR, CHAR(DTTRAN, ISO), LOCID, TERMNO, UIDTX,
TRANID, TRANSPID , POEDEST, ICMRST, CNTRTY, TARHITIND,
SYNBATCHNO, CHAR(TMTRAN, ISO), PGRCD, CNLREA, CNLRMK,
TMSTMPLSTUPD, SAERRIND
FROM db2ica.WICMRD
WHERE (TMSTMPLSTUPD > '2003-01-01-00.00.00.000000' ) OR (TMSTMPLSTUPD = '2003-01-01-00.00.00.000000' AND
MCID > 'G1' ) OR (TMSTMPLSTUPD = '2003-01-01-00.00.00.000000' AND MCID =
'G1' AND MID > 10000 )
ORDER BY TMSTMPLSTUPD, MCID, MID
OPTIMIZE
FOR 1 ROWS;
Explain Plan for Dynamic SQL
----------------------------------
Estimated Cost = 366530.593750
Estimated Cardinality = 980307.000000
Access Table Name = DB2ICA.LICMRD ID = 7,4
| #Columns = 24
| Index Scan: Name = DB2ICA.XICMRD2 ID = 4
| | Regular Index (Not Clustered)
| | Index Columns:
| | | 1: TMSTMPLSTUPD (Ascending)
| | | 2: MCID (Ascending)
| | | 3: MID (Ascending)
| | #Key Columns = 0
| | | Start Key: Beginning of Index
| | | Stop Key: End of Index
| | Data Prefetch: None
| | Index Prefetch: None
| | Sargable Index Predicate(s)
| | | #Predicates = 6
| Lock Intents
| | Table: Intent Share
| | Row : Next Key Share
Return Data to Application
| #Columns = 24
End of section
The table structure and index:
Table
------
CREATE TABLE "DB2ICA "."LICMRD" (
"MCID" CHAR(2) NOT NULL ,
"MID" INTEGER NOT NULL ,
"ICPRF1" CHAR(1) NOT NULL ,
"ICPRF2" CHAR(1) NOT NULL ,
"ICNUM" INTEGER NOT NULL ,
"DTCLEAR" DATE NOT NULL ,
"DTTRAN" DATE NOT NULL ,
"LOCID" CHAR(3) NOT NULL ,
"TERMNO" SMALLINT NOT NULL ,
"TRANSPID" CHAR(7) NOT NULL ,
"POEDEST" CHAR(1) NOT NULL ,
"ICMRST" CHAR(1) NOT NULL ,
"CNTRTY" CHAR(1) NOT NULL ,
"TARHITIND" CHAR(1) NOT NULL ,
"SYNBATCHNO" INTEGER NOT NULL ,
"TMTRAN" TIME NOT NULL WITH DEFAULT CURRENT TIME ,
"SAERRIND" CHAR(1) NOT NULL WITH DEFAULT '0' ,
"TMMRCLEAR" INTEGER NOT NULL ,
"UIDTX" CHAR(8) NOT NULL ,
"TRANID" CHAR(4) NOT NULL ,
"PGRCD" CHAR(1) NOT NULL ,
"CNLREA" CHAR(2) NOT NULL ,
"CNLRMK" CHAR(150) NOT NULL ,
"TMSTMPLSTUPD" TIMESTAMP NOT NULL WITH DEFAULT CURRENT TIMESTAMP )
IN "TPMRC_TBL" INDEX IN "TPMRC_IDX" ;
Index
-------
CREATE UNIQUE INDEX "DB2ICA "."XICMRD" ON "DB2ICA "."LICMRD"
("MCID" ASC,
"MID" ASC);
CREATE INDEX "DB2ICA "."XICMRD1" ON "DB2ICA "."LICMRD"
("TRANID" ASC,
"ICNUM" ASC,
"ICPRF2" ASC);
CREATE UNIQUE INDEX "DB2ICA "."XICMRD2" ON "DB2ICA "."LICMRD"
("TMSTMPLSTUPD" ASC,
"MCID" ASC,
"MID" ASC);
CREATE INDEX "DB2ICA "."XLICMRD2" ON "DB2ICA "."LICMRD"
("TRANID" ASC,
"LOCID" ASC,
"ICPRF1" ASC,
"ICPRF2" ASC,
"ICNUM" ASC,
"TMSTMPLSTUPD" ASC);
View
------
CREATE VIEW DB2ICA.WICMRD AS SELECT MCID, MID, ICPRF1 , ICPRF2, ICNUM, DTCLEAR
, DTTRAN, LOCID, TERMNO , TRANSPID, POEDEST, ICMRST , CNTRTY, TARHITIND,
SYNBATCHNO , TMTRAN, SAERRIND, TMMRCLEAR , UIDTX, TRANID, PGRCD , CNLREA,
CNLRMK, TMSTMPLSTUPD FROM DB2ICA.LICMRD;
From the explain, we found that the cost of Dynamic SQL is much more than Static one, but actually the running time of Dynamic SQL is much less than Static one.....