Abstract: It is a real problem to track SQL performance over the life cycle of large Java frame-work based systems. Anixter solved this problem by developing a process to transfer the Dynamic Statement Cache data into a history table. This table contains a reformatted SQL statement and an Explain Report as well as the statistics columns for captured statements. Within this presentation, you will get a detailed introduction to the components that are needed to create a Dynamic SQL Cache History process. Speaker Bio: DB2 Database Administration and Programming since 1988. All versions of DB2. Motorola, 1998-1992 DB2 DBA Platinum Technology, Inc 1992-1999, DB2 Internal Application using DB2 C/S Applications and Peoplesoft. CA Technology 2000-2009 DB2 DBA Manager, Managed DB2 SAP 2005- 2009. DB2 Consultant 2009-2010, Database Design and Performance Management, Migrated DB2 V8-V9. Anixter Inc, 2010-2012 DB2 DBA, Database Design and Performance Management, Migrated DB2 V9-V10. Member of IBM DB2 z/OS Customer Advisory Board, 2013 1
45
Embed
Abstract: It is a real problem to track SQL performance over the life cycle … Monitorin… · · 2017-11-16Abstract: It is a real problem to track SQL performance over the life
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Abstract: It is a real problem to track SQL performance over the life cycle of large Java frame-work based systems.
Anixter solved this problem by developing a process to transfer the Dynamic Statement Cache data into a history table. This table contains a reformatted SQL statement and an Explain Report as well as the statistics columns for captured statements. Within this presentation, you will get a detailed introduction to the components that are needed to create a Dynamic SQL Cache History process.
Speaker Bio: DB2 Database Administration and Programming since 1988. All versions of DB2.
Motorola, 1998-1992 DB2 DBA
Platinum Technology, Inc 1992-1999, DB2 Internal Application using DB2 C/S Applications and Peoplesoft.
CA Technology 2000-2009 DB2 DBA Manager, Managed DB2 SAP 2005-2009.
ASSOCIATE RESULT SET LOCATOR (LOC_CUR1, LOC_CUR2 )
WITH PROCEDURE T80DBA.EXPLAIN_DYNAMIC_REPORTS ;
ALLOCATE A1 CURSOR FOR RESULT SET LOC_CUR1;
IF EXPL_IND = 1 THEN
SET V_EXPL_BAD = V_EXPL_BAD + 1 ;
ELSE
FETCH A1 INTO P1.V_ROW ;
IF LOCATE('FAILED=0', P1.V_ROW) > 0 THEN
SET V_EXPL_OK = V_EXPL_OK + 1 ;
ELSE
SET V_EXPL_BAD = V_EXPL_BAD + 1 ;
END IF;
END IF;
CLOSE A1 ;
END LOOP;
CLOSE C0;
COMMIT;
SET V_SQL = 'SELECT char(EXPLAIN_TS) as EXPLAIN_TS, count(*) as CNT from ' ||
' T80dba.EXPLN_STMT_CACHE_TABLE WHERE explain_ts = ? ' ||
' Group By Explain_ts ' ||
' UNION ALL ' ||
' SELECT ''EXPLAIN OK COUNT '' , CAST(? as integer) AS CNT FROM SYSIBM.SYSDUMMY1 ' ||
' UNION ALL ' ||
' SELECT ''EXPLAIN BAD COUNT '' , CAST(? AS INTEGER) AS CNT FROM SYSIBM.SYSDUMMY1 ' ;
PREPARE SEL2 FROM V_SQL ;
OPEN RET_CURSOR USING IN_TS, P1.V_EXPL_OK, P1.V_EXPL_BAD ;
19
CREATE PROCEDURE EXPLAIN_DYNAMIC_REPORTS
( IN IN_TS VARCHAR(26)
, IN_STMT_ID INTEGER
)
VERSION VERSION1
ISOLATION LEVEL CS
RESULT SETS 1
LANGUAGE SQL
…
SELECT V1.STMT_ID, V1.EXPLAIN_TS, CHAR(user,16) as EXPLAIN_USER, V1.COLLID, upper(V1.SCHEMA) AS SCHEMA, UPPER(V1.BIND_QUALIFIER) AS BIND_QUALIFIER, V1.PRIMAUTH, V1.CURSQLID, CAST(( CASE WHEN Upper(ltrim(V1.stmt_text1)) LIKE '%UPDATE %' THEN Substr(Substr(ltrim(V1.stmt_text1), 8, 50), 1, Locate(space(1), Substr(ltrim(V1.stmt_text1), 8, 50))) WHEN Upper(ltrim(V1.stmt_text1)) LIKE '%INSERT %' THEN Substr(Substr(ltrim(V1.stmt_text1), 13, 50), 1, Locate(space(1), Substr(ltrim(V1.stmt_text1), 13, 50))) WHEN ( Upper(ltrim(V1.stmt_text1)) LIKE '%SELECT%' OR Upper(ltrim(V1.stmt_text1)) LIKE '%WITH %' OR Upper(ltrim(V1.stmt_text1)) LIKE '%DELETE %' ) THEN Substr( Substr(ltrim(coalesce(V1.stmt_text2,V1.stmt_text1)), Locate(' FROM ', upper(ltrim(coalesce(V1.stmt_text2,V1.stmt_text1))), 1) + 6, 50), 1, Locate(space(1), Substr(ltrim(coalesce(V1.stmt_text2,V1.stmt_text1)) , Locate(' FROM ', upper(ltrim(coalesce(V1.stmt_text2,V1.stmt_text1))), 1) + 6, 50))) ELSE Space(32) END ) AS VARCHAR(32)) AS tab1, ( CASE WHEN Upper(ltrim(V1.stmt_text1)) LIKE '%DELETE %' THEN 'Delete' WHEN Upper(ltrim(V1.stmt_text1)) LIKE '%UPDATE %' THEN 'Update' WHEN Upper(ltrim(V1.stmt_text1)) LIKE '%INSERT %' THEN 'Insert' WHEN Upper(ltrim(V1.stmt_text1)) LIKE '%SELECT%' THEN 'Select' WHEN Upper(ltrim(V1.stmt_text1)) LIKE '%WITH %' THEN 'Select' ELSE Space(8) END ) AS statement_type, CAST (CASE WHEN locate(' QUERYNO ', upper(Coalesce(V1.stmt_text2,V1.stmt_text1))) > 0 THEN t80dba.val2(left(substr(Coalesce(V1.stmt_text2,V1.stmt_text1), locate(' QUERYNO ', upper(Coalesce(V1.stmt_text2,V1.stmt_text1))) + 9),10)) ELSE 0 END AS INTEGER) as QUERYNO, length(V1.stmt_text1) + coalesce(length(rtrim(V1.stmt_text2)),0) as stmt_length, V1.STMT_TEXT1, V1.STMT_TEXT2, V1.STAT_EXEC, V1.STAT_GPAG, V1.GPAG_EXEC, V1.STAT_SYNR, V1.STAT_WRIT, V1.STAT_EROW, V1.EROW_EXEC, V1.STAT_PROW, V1.PROW_EXEC, V1.STAT_SORT, V1.STAT_INDX, V1.INDX_EXEC, V1.STAT_RSCN, V1.STAT_PGRP, V1.STAT_ELAP, V1.ELAP_EXEC, V1.STAT_CPU, V1.CPU_EXEC, V1.STAT_SUS_SYNIO, V1.STAT_SUS_LOCK, V1.STAT_SUS_SWIT, V1.STAT_SUS_GLCK, V1.STAT_SUS_OTHR, V1.STAT_SUS_OTHW, V1.STAT_RIDLIMT, V1.STAT_RIDSTOR, V1.program_name FROM (SELECT s.collid, s.explain_ts, s.stmt_id, CAST(s.SCHEMA as VARCHAR(16)) as SCHEMA, CAST(s.bind_qualifier AS VARCHAR(16)) AS bind_qualifier, CAST(s.primauth AS VARCHAR(16)) AS primauth, CAST(s.cursqlid AS VARCHAR(16)) AS cursqlid, REPLACE(Translate(CAST(s.stmt_text AS VARCHAR(32000)), SPACE(2), x'090A' ) , SPACE(2), SPACE(1)) AS stmt_text1, ( CASE WHEN LENGTH(s.stmt_text) > 32000 THEN replace(translate(cast(substr(s.stmt_text,32001,32000) as varchar(32000)) ,SPACE(2), x'090A' ) ,SPACE(2),SPACE(1) ) ELSE NULL END ) as stmt_text2, s.stat_exec, s.stat_gpag, CAST(Real(s.stat_gpag) / s.stat_exec AS DECIMAL(14, 2)) AS gpag_exec, s.stat_synr, s.stat_writ, s.stat_erow, CAST(Real(s.stat_erow) / s.stat_exec AS DECIMAL(14, 2)) AS erow_exec, s.stat_prow, CAST(Real(s.stat_prow) / s.stat_exec AS DECIMAL(14, 2)) AS prow_exec, s.stat_sort, s.stat_indx, CAST(Real(s.stat_indx) / s.stat_exec AS DECIMAL(14, 2)) AS indx_exec, s.stat_rscn, s.stat_pgrp, CAST(s.stat_elap as DECIMAL(14,6)) as STAT_ELAP, CAST(Real(s.stat_elap) / s.stat_exec AS DECIMAL(14, 6)) AS elap_exec, CAST(s.stat_cpu as DECIMAL(14,6)) as STAT_CPU, CAST(Real(s.stat_cpu) / s.stat_exec AS DECIMAL(14, 6)) AS cpu_exec, CAST(s.stat_sus_synio as DECIMAL(14,6)) AS stat_sus_synio, CAST(s.stat_sus_lock as DECIMAL(14,6)) AS stat_sus_lock, CAST(s.stat_sus_swit as DECIMAL(14,6)) AS stat_sus_swit, CAST(s.stat_sus_glck as DECIMAL(14,6)) AS stat_sus_glck, CAST(s.stat_sus_othr as DECIMAL(14,6)) AS stat_sus_othr, CAST(s.stat_sus_othw as DECIMAL(14,6)) AS stat_sus_othw, s.stat_ridlimt, s.stat_ridstor, s.program_name FROM dsn_statement_cache_table S WHERE s.explain_ts = ? AND s.STMT_ID between ? AND ? AND LENGTH(s.stmt_text) < 62000 AND s.stat_exec > 0 AND NOT EXISTS (select 1 FROM T80DBA.EXPLN_STMT_CACHE_TABLE E WHERE S.explain_ts = E.explain_ts AND S.STMT_ID = E.STMT_ID AND S.COLLID = E.COLLID ) ) AS v1 WITH UR
20
SET CURRENT SCHEMA = V_BIND_QUALIFIER ;
SET V_SQL = CAST (
CAST('EXPLAIN PLAN SET QUERYNO = ' || CHAR(P1.VQRY) || ‘ FOR ' AS CLOB )