各位大佬能帮我看看这个触发器编写的问题么?我现在好多东西还在学,实在不知道该怎么解决了

xzsfg6825 2017-11-11 04:14:21

这个触发器该怎么优化呢?我个人现在从思路上也堵住了,思路打不开,不知道该怎么办了。。。
...全文
224 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
xzsfg6825 2017-11-14
  • 打赏
  • 举报
回复
引用 11 楼 wmxcn2000 的回复:
[quote=引用 9 楼 蓝色-鸢尾的回复:][quote=引用 8 楼 wmxcn2000 的回复:] [quote=引用 6 楼 蓝色-鸢尾的回复:][quote=引用 1 楼 wmxcn2000 的回复:] 直接使用表级触发器不就行了吗?
大佬,改成表级的得出的结果跟行级不加判断的结果一样,不知为啥不行,不得已才在行级的触发器里加判断来实现我的功能[/quote] 25000条数据,你是怎么更新的? 是执行了25000个update 语句,还是一个update 语句更新了25000行。[/quote] 程序是使用ADO编写的接口,使用了ado记录集的addnew、UpdateBatch方法,对获取到的记录集进行批更新。 按理说,这个方法应该是在缓存中更新完25000条之后再进行UpdateBatch方法直接全部更新进数据库的。不太懂他这个批更新的机制~[/quote] 这个是逐条更新的,也就是说调用了25000次update,每个update 更新一条记录,这样的话,表级触发器和行级的性能相差无几了。 建议:修改程序代码,执行完这个批量update 后,增加执行这个过程的逻辑。[/quote] 哦哦明白了,那还有没有其他办法呢?在不修改程序的情况下,通过修改数据库的触发器或者存储过程什么的来实现这个更新的要求呢? 我上面写的那个触发器可以怎么优化呢?感谢大佬,感激!
卖水果的net 2017-11-13
  • 打赏
  • 举报
回复
引用 9 楼 蓝色-鸢尾的回复:
[quote=引用 8 楼 wmxcn2000 的回复:] [quote=引用 6 楼 蓝色-鸢尾的回复:][quote=引用 1 楼 wmxcn2000 的回复:] 直接使用表级触发器不就行了吗?
大佬,改成表级的得出的结果跟行级不加判断的结果一样,不知为啥不行,不得已才在行级的触发器里加判断来实现我的功能[/quote] 25000条数据,你是怎么更新的? 是执行了25000个update 语句,还是一个update 语句更新了25000行。[/quote] 程序是使用ADO编写的接口,使用了ado记录集的addnew、UpdateBatch方法,对获取到的记录集进行批更新。 按理说,这个方法应该是在缓存中更新完25000条之后再进行UpdateBatch方法直接全部更新进数据库的。不太懂他这个批更新的机制~[/quote] 这个是逐条更新的,也就是说调用了25000次update,每个update 更新一条记录,这样的话,表级触发器和行级的性能相差无几了。 建议:修改程序代码,执行完这个批量update 后,增加执行这个过程的逻辑。
xzsfg6825 2017-11-13
  • 打赏
  • 举报
回复
引用 7 楼 qq646748739 的回复:
[quote=引用 6 楼 蓝色-鸢尾的回复:][quote=引用 1 楼 wmxcn2000 的回复:] 直接使用表级触发器不就行了吗?
大佬,改成表级的得出的结果跟行级不加判断的结果一样,不知为啥不行,不得已才在行级的触发器里加判断来实现我的功能[/quote] if m = n条件有问题,猜测每次都相等。 你先把 before update改成 after update看看[/quote] 我确认了一下,m和n的条件应该没问题呀?行级的时候,每更新一条,序列就+1,加到满足条件的时候执行序列重置的存储过程和转存数据的存储过程。 然后是before和after的问题,这个必须是before,因为更新的时候我的表中是有数据的,触发器就是要把表中的关键数据转存入另一个表中,所以after会漏掉第一次插入的数据。 或者有没有其他办法把序列累加的这个替换掉,因为我发现序列累加的这个挺占资源
xzsfg6825 2017-11-13
  • 打赏
  • 举报
回复
引用 8 楼 wmxcn2000 的回复:
[quote=引用 6 楼 蓝色-鸢尾的回复:][quote=引用 1 楼 wmxcn2000 的回复:] 直接使用表级触发器不就行了吗?
大佬,改成表级的得出的结果跟行级不加判断的结果一样,不知为啥不行,不得已才在行级的触发器里加判断来实现我的功能[/quote] 25000条数据,你是怎么更新的? 是执行了25000个update 语句,还是一个update 语句更新了25000行。[/quote] 程序是使用ADO编写的接口,使用了ado记录集的addnew、UpdateBatch方法,对获取到的记录集进行批更新。 按理说,这个方法应该是在缓存中更新完25000条之后再进行UpdateBatch方法直接全部更新进数据库的。不太懂他这个批更新的机制~
卖水果的net 2017-11-13
  • 打赏
  • 举报
回复
引用 6 楼 蓝色-鸢尾的回复:
[quote=引用 1 楼 wmxcn2000 的回复:] 直接使用表级触发器不就行了吗?
大佬,改成表级的得出的结果跟行级不加判断的结果一样,不知为啥不行,不得已才在行级的触发器里加判断来实现我的功能[/quote] 25000条数据,你是怎么更新的? 是执行了25000个update 语句,还是一个update 语句更新了25000行。
碧水幽幽泉 2017-11-13
  • 打赏
  • 举报
回复
引用 6 楼 蓝色-鸢尾的回复:
[quote=引用 1 楼 wmxcn2000 的回复:] 直接使用表级触发器不就行了吗?
大佬,改成表级的得出的结果跟行级不加判断的结果一样,不知为啥不行,不得已才在行级的触发器里加判断来实现我的功能[/quote] if m = n条件有问题,猜测每次都相等。 你先把 before update改成 after update看看
xzsfg6825 2017-11-13
  • 打赏
  • 举报
回复
引用 1 楼 wmxcn2000 的回复:
直接使用表级触发器不就行了吗?
大佬,改成表级的得出的结果跟行级不加判断的结果一样,不知为啥不行,不得已才在行级的触发器里加判断来实现我的功能
xzsfg6825 2017-11-13
  • 打赏
  • 举报
回复
引用 3 楼 qq646748739 的回复:
行级触发器改成表级触发器,只要把:for each row去掉就行。
大佬,表级的我也试过,但不知为啥并不行。我的插入触发器也是,明明是表级触发,但最后的结果的样子还是行级触发的结果,实在搞不懂了,就因为这个情况我才先改成了行级的,并对一个序列进行累加判断,直到符合要求才执行存储过程。 难道是改成表级的触发器也得自己再加些判断么?
xzsfg6825 2017-11-13
  • 打赏
  • 举报
回复
引用 1 楼 wmxcn2000 的回复:
直接使用表级触发器不就行了吗?
大佬,我也试过,但是不知为啥,使用表级的触发器,产生的依然是每更新一次就触发一次,产生的结果跟行级的一样,彻底无语,所以才不得已先改成了行级的触发
碧水幽幽泉 2017-11-12
  • 打赏
  • 举报
回复
行级触发器改成表级触发器,只要把:for each row去掉就行。
碧水幽幽泉 2017-11-12
  • 打赏
  • 举报
回复
既然实现的功能是:25000条记录更新完才执行这个触发器。 那么应该表行级触发器改成表级触发器。
卖水果的net 2017-11-12
  • 打赏
  • 举报
回复
直接使用表级触发器不就行了吗?

17,082

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧