问题现象
某客户使用jdbc接口向yashandb的表A插入数据。
表A上有一个语句级触发器,其内容为在触发时执行alter sequence操作;另外还有一个insert时的行级触发器,其内容为将每行的部分列赋给新值,这些新值要么来自sequence.nextval,要么来自于current_timestamp。
客户向表A插入90万条数据大概要花费两个半小时。
问题的风险及影响
表中插入数据慢,影响客户系统的处理效率。
问题影响的版本
22.2.14.100及以前的所有版本
23.2.1.100及以前的所有版本
问题发生原因
yashandb的代码bug,批量执行循环调用anlExecuteSingle,会多次触发语句级触发器
解决方法及规避方式
版本层面通过修改代码解决。
规避方式不使用语句级触发器
问题分析和处理过程
使用如下的ddl来验证语句级触发器被触发了多少次:
使用如下的java代码来触发:
java代码执行完成后,查看flag表中的总数据量,就可以知道触发器被触发了多少次。yashandb的实际结果:
可以看到,语句级触发器被触发了100次,这是不合理的。
经验总结
了解客户对jdbc的使用场景;
灵活使用辅助表来验证触发器的触发次数。