问候, 最近我开始研究一个应用程序,其中 8 个不同的模块在工作流的某个时刻使用同一个表。该表有一个 5,000 行长的替代触发器(其中前 500 行和后 500 行对所有模块都是通用的,然后每个模块都有自己的 500 行代码)。由于模块的数量将会增长,并且我希望尽可能保持清晰(和独立),我想知道是否有某种最佳实践将触发器拆分为存储过程,或者我应该将它们全部放在一个地方? PS 从触发器调用过程并将 15 个以上的参数传递给它们是否会有任何性能损失?
2 回答
请记住,inserted
和deleted
伪表只能从触发器代码中访问,并且它们可以包含多行,您面临两种选择:
以 RBAR 1方式处理行
inserted
,以便能够将标量参数传递给存储过程,或者,deleted
将所有数据从表变量复制到表变量,然后根据需要将这些数据传递给过程
inserted
。deleted
我希望这两种方法都会强加一些2性能开销,仅来自复制
话虽如此,听起来触发器本身内部发生了太多事情 - 所有这些代码是否都必须是执行 DML 语句的同一事务的一部分?如果没有,请考虑使用某种形式的队列(例如,请求表或 Service Broker)在其中放置有关要执行的工作的信息,然后稍后处理数据 - 如果您使用 Service Broker,您可以让它检查共享消息,然后根据需要将适当的消息发送到每个模块的专用端点。
1 Row By Agonizing Row - 使用任何cursor
其他东西来模拟一个依次访问每一行 - 通常在基于集合的语言(如 SQL)中不受欢迎。
2如果不深入了解代码的细节并可能尝试所有可能的方法并衡量结果,就不可能知道多少。
我认为在这种情况下不会有有意义的性能损失。
无论如何,将它全部写在触发器中是不好的做法(当它长 5000 行时......)。我觉得主要考虑的是可维护性,如果拆分成几个SP会好很多