Or may be top 10. Or 3. Whatever the number, we are often looking for the worst offenders kicking up the server’s CPU utilisation or I/O wait time to the skies. DB2 built-in snapshot functions are a great help. Run “
select * from table (snapshot_dyn_sql('YOURDB', -1)) t order by rows_read desc fetch first 5 rows only” and you will get a list of the queries retrieving the most data. The only thing is, snapshot functions provide, well, snapshots of the DB2 monitor data and are not by themselves suitable for the collection of historical data. Monitor counters can be reset without your knowledge, for example when the database is deactivated or when the SQL statement expires from the package cache.
To ensure continuity of the data collected by snapshot functions we can quickly create a table where we will store historical snapshot information:
create table DYNSQLDATA as (select * from table (snapshot_dyn_sql('YOURDB', -1)) t) with no data
We will then insert output of the snapshot function into this table at regular intervals:
insert into DYNSQLDATA select t.* from table (snapshot_dyn_sql('YOURDB', -1)) t
Now we can easily determine which statements demand most resources and analyze their historical performance. (more…)