单 18 显示了运行 perl 脚本的命令,该脚本帮助您根据 wlm 事件监控器数据计算索引使用。
清单 18. 执行 wlmhist.pl 和 wlmhistrep.pl perl 脚本
cd "c:\program files\ibm\sqllib\samples\perl"
perl wlmhist.pl sample userid password
perl wlmhistrep.pl sample userid password wlmhistrep.txt
wlmhistrep.pl 生成的报告包含 4 个部分:已使用(命中)表、未使用(未命中)表、已使用(命中)索引和未使用(未命中)索引。对于这个场景,您主要对未使用索引部分感兴趣。清单 19 显示了一个样例报告。
清单 19. wlmhistrep.pl 生成的样例报告
indexes hit report for database sample
_______________________________________________________
table name table schema object name object schema total hits
__________________ _______________ __________________ _______________ __________
...
department fechner pk_department fechner 245
department fechner xdept2 fechner 678
employee fechner pk_employee fechner 123
employee fechner xemp2 fechner 456
project fechner pk_project fechner 345
...
indexes not hit report for database sample
___________________________________________________________
table name table schema index name index schema index type
__________________ _______________ __________________ _______________ __________
...
department fechner xdept3 fechner reg
project fechner xproj2 fechner reg
...
indexes hit report 部分有一个 total hits 列,它表明索引被访问的次数。从未被访问过的索引显示在 indexes not hit report 部分。
回页首
mon_get_index 表函数
本文的 db2pd 实用程序 小节演示了如何使用 db2pd 实用程序获取索引度量指标。不过,如果您使用的是 db2 version 9.7,可以通过查询新的 mon_get_index 表函数获取相同的信息。使用表函数取代 db2pd 实用程序简化了结果计算,因为可以通过与 syscat.indexes 目录视图结合将索引 ids (iids) 转换成索引名。清单 20 显示了如何调用 mon_get_index 表函数的样例。
清单 20. mon_get_index 表函数(文件名 mon_get_index.sql)的样例调用
select
substr(si.indschema, 1, 30) as indschema,
substr(si.indname, 1, 30) as indname,
mgi.index_scans,
mgi.index_only_scans
from
table(mon_get_index('fechner', 'department', -2)) as mgi,
syscat.indexes as si
where
mgi.tabschema = si.tabschema
and mgi.tabname = si.tabname
and mgi.iid = si.iid
order by
mgi.index_scans desc;
mon_get_index 期望接收以下参数:
表模式
表名
数据库分区号
对于单分区数据库,您可以对数据库分区号仅指定 -1(当前分区)或 -2(所有分区),结果是一样的。如果您省略了表名(即指定 null 或空字符串),那么为指定的模式中的所有表返回信息。如果您省略了表名和表模式,那么为数据库中的所有表返回信息。
清单 21 显示了来自类似于以上查询的样例结果。
清单 21. 来自 mon_get_index 表函数的结果
db2 -tf mon_get_index.sql
indschema indname index_scans index_only_scans
-------------------- -------------------- -------------------- --------------------
fechner xdept2 678 0
fechner pk_department 245 0
fechner xdept3 0 0
3 record(s) selected.
mon_get_index 表函数和 db2pd 实用程序提供相同的索引度量指标(扫描索引和仅扫描索引的数量)。不过,您可能发现,处理 mon_get_index 表函数返回的结果集比计算 db2pd 实用程序的输出更加容易。
回页首
结束语
未使用和很少使用的索引可能导致 uid 操作(update、insert 和 delete)和数据库维护活动(比如 runstats 和 reorg)的运行时间更长。这些索引还占用表空间容器和备份映像中的存储空间,您可以通过删除这些索引来更好地利用它们所占用的空间。本文展示了几种方法,用于识别在数据库中定义的未使用和很少使用的索引。您可以根据通过这些方法获得的信息删除不需要的索引。删除不必要的索引能够显著改善 db2 luw 数据库的性能。