使用一些用法列表以在影响特定表的 DML 语句段执行时标识这些语句段。可查看每个语句的统计信息并使用这些统计信息来确定可能需要其他监视或调整的位置。
开始之前
执行以下任务:
- 标识要查看其对象用法统计信息的表。可使用 MON_GET_TABLE
表函数来查看一个或多个表的监视指标。
- 要发出必需语句,请确保每个语句的授权标识所持有的特权包括 DBADM 权限或 SQLADM 权限。
- 确保您对 MON_GET_TABLE_USAGE_LIST 和 MON_GET_USAGE_LIST_STATUS 表函数具有 EXECUTE 特权。
关于此任务
查看 MON_GET_TABLE 表函数的输出时,可能会见到不寻常的监视元素值。可使用一些用法列表来确定是否有任何 DML 语句影响了此值。
用法列表包含有关特定时间段内影响表的每个语句的锁定和缓冲池使用情况之类的因子的统计信息。如果确定某个语句对表有负面影响,请使用这些统计信息来确定是否需要进一步监视或如何调整此语句。
过程
要标识影响表的语句,请执行以下操作:
-
通过发出以下命令,将 mon_obj_metrics 配置参数设置为 EXTENDED:
DB2 UPDATE DATABASE CONFIGURATION USING MON_OBJ_METRICS EXTENDED
将此配置参数设置为 EXTENDED 可确保针对用法列表中的每个条目收集统计信息。
- 通过使用 CREATE USAGE LIST 语句来为表创建用法列表。
例如,要为 SALES.INVENTORY 表创建 INVENTORYUL 用法列表,请发出以下命令:
CREATE USAGE LIST INVENTORYUL FOR TABLE SALES.INVENTORY
- 通过使用 SET USAGE LIST STATE 语句来激活对象用法统计信息的收集。
例如,要激活针对 INVENTORYUL 用法列表的收集,请发出以下命令:
SET USAGE LIST INVENTORYUL STATE = ACTIVE
- 在收集对象统计信息期间,使用 MON_GET_USAGE_LIST_STATUS 表函数来确保用法列表处于活动状态并且已对此用法列表分配足够内存。
例如,要检查 INVENTORYUL 用法列表的状态,请发出以下命令:
SELECT MEMBER,
STATE,
LIST_SIZE,
USED_ENTRIES,
WRAPPED
FROM TABLE(MON_GET_USAGE_LIST_STATUS('SALES', 'INVENTORYUL', -2))
- 经历要收集对象用法统计信息的时间段后,应使用 SET USAGE LIST STATE 语句来取消激活用法列表数据的收集。
例如,要取消激活对 INVENTORYUL 用法列表的收集,请发出以下命令:
SET USAGE LIST SALES.INVENTORYUL STATE = INACTIVE
- 使用 MON_GET_TABLE_USAGE_LIST 函数来查看收集的信息。
可查看收集统计信息的时间段内影响表的一部分或全部语句的统计信息。
例如,如果只想查看读取最多表行的 10 个语句,请发出以下命令:
SELECT MEMBER,
EXECUTABLE_ID,
NUM_REFERENCES,
NUM_REF_WITH_METRICS,
ROWS_READ,
ROWS_INSERTED,
ROWS_UPDATED,
ROWS_DELETED
FROM TABLE(MON_GET_TABLE_USAGE_LIST('SALES', 'INVENTORYUL', -2))
ORDER BY ROWS_READ DESC
FETCH FIRST 10 ROWS ONLY
- 如果要查看影响此表的语句的文本,请将 MON_GET_TABLE_USAGE_LIST 输出中的 executable_id
元素的值用作 MON_GET_PKG_CACHE_STMT 表函数的输入。
例如,发出以下命令以查看特定语句的文本:
SELECT STMT_TEXT
FROM
TABLE
(MON_GET_PKG_CACHE_STMT(NULL, x'01000000000000007C0000000000000000000000020020081126171720728997',
NULL, -2))
- 使用语句列表和为语句提供的统计信息来确定需要额外监视或调整的位置。
例如,pool_writes 监视元素值很低(相对于
direct_writes 监视元素值)的语句可能存在需要注意的缓冲池问题。
下一步做什么
不需要用法列表中的信息时,请使用 SET USAGE LIST STATE 语句来释放与用法列表相关联的内存。例如,要释放 INVENTORYUL 用法列表的内存,请发出以下命令:
SET USAGE LIST SALES.INVENTORYUL STATE = RELEASED