分析 IBM DB2 9.7 触发器的性能



有没有一种简单的方法来分析 DB2 9.7 更新/插入/删除触发器的性能?我遇到这样一种情况,当我使用一组参数执行触发器时,需要 1 秒才能完成。当我使用相同的参数第二次执行它时,执行力下降到 10ms。如果我使用其他一些参数执行相同的触发器,则再次需要 1 秒。所以显然有一些缓存。但是,语句结构仍然相同,因此在我看来,它不需要从头开始构建任何东西。

我现在需要分析触发器以查看执行时间的实际花费位置。

感谢AngocA的回答。触发器将一组新行插入到 另一个表。在后续运行中,触发相同数量的行 并补充道。这就是为什么我对为什么第一个有点困惑 运行很慢,但下一个完全相同的运行速度快 10 倍。

它与加载表有关。DBMS 通常没有内存中的所有表(或表的所有数据)。数据库将数据存储在页面上。每个页面可以(并且应该)包含多行。当您添加一行时,它将被添加到一个表中,该表通常(不完全确定我是否应该总是在这里写)按表的主键排序。因此,根据要添加到表中的行,需要写入不同的页面。如果尚未加载,则需要先加载,这需要花费时间。下次您需要编写类似的行时,它很可能会放在同一页面上。

如果页面已满,则需要将其拆分,以确保可以将新记录写入正确的位置。因此,根据数据的不同,数据库需要完成不同的工作。但是,在所有情况下,都需要立即将数据保存到数据库中。因此,您始终需要等待写入完成。

如您所见,可能会涉及一些兑现。这对于数据库来说是正常的。

至于你最初的问题;看看触发器的sql,找出访问路径是什么。

它描述了触发器的作用。例如,如果使用一组参数,它只需要更新一行,但如果使用另一组参数,它应该更新一百万行,则性能就不一样了。

触发器没有缓存,所有事务都直接写入事务日志。这就是您应该分析触发器中使用的查询的访问计划的原因。您还应该分析 IO 和其他相关元素,以发现不同集发生的情况。

不要忘记更新统计信息,为什么不对所涉及的表执行重组。

最新更新