0

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

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

4

2 回答 2

0

这取决于触发器的作用。例如,如果使用一组参数,它只需要更新一行,但如果使用另一组参数,它应该更新一百万行,那么性能就不一样了。

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

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

于 2013-11-07T09:07:04.777 回答
0

感谢 AngocA 的回答。触发器将一组新行插入另一个表。在随后的运行中,触发并添加了相同数量的行。这就是为什么我对为什么第一次运行很慢感到有些困惑,但下一次完全相同的运行却快了 10 倍。

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

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

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

至于你原来的问题;查看触发器的 sql 以了解访问路径是什么。

于 2013-11-07T14:30:43.613 回答