假设我正在使用存储过程在表上执行插入/更新/删除操作。
根据某些标准,我想执行一些操作。
我应该创建触发器还是在存储过程本身中执行操作。
使用触发器会降低性能吗?
这两个表格是已插入和已删除是否存在(持久)或动态创建?
如果它们是动态创建的,则会出现性能问题。
如果它们是持久表,那么它们在哪里?
此外,如果他们使用exixts,那么我可以在存储过程中访问插入和已删除表吗?
答案 0 :(得分:7)
是的,带有触发器的表格不会像没有触发器一样好。逻辑要求做某事比做什么都贵。
我认为如果你问一下你的问题是否比你没有指定的其他方法更有效,我会更有意义。
最终,我会选择最适合工作的工具,只有在出现问题时才会担心性能问题,而不是在实施解决方案之前。
触发器中提供了已插入和已删除的表,因此从存储过程中调用它们是不行的。
答案 1 :(得分:7)
在存储过程中执行相同的操作会不会降低性能。可能不是只有所有性能问题,真正知道的唯一方法是用实际数据集测试两种方法(如果你有一个2,000,000记录表不用一个包含100条记录的表进行测试!)
也就是说,触发器和另一种方法之间的选择完全取决于无论数据如何更新,删除或插入,都需要执行相关操作。如果这是一个必须始终发生的业务规则,那么触发器最适合它,否则最终会出现数据完整性问题。数据库中的数据经常从GUI以外的来源更改。
在编写触发器时,您应该注意几件事情。首先,触发器会为每个批次触发一次,因此无论您是插入一条记录还是100,000条记录,触发器只会触发一次。您不能假设只有一条记录会受到影响。你也不能认为它总是只是一个小记录集。这就是编写所有触发器的关键所在,就好像要插入,更新或删除一百万行一样。这意味着基于集合的逻辑,如果可能的话,没有游标或while循环。不要将写入的存储过程写入处理一条记录并在触发器中的光标中调用它。
另外,不要从游标发送电子邮件,如果电子邮件服务器关闭,您不希望停止所有插入,更新或删除。
答案 2 :(得分:2)
根据定义,它会降低查询的性能:然后查询会执行其他方式不会执行的操作。
另一种看待它的方法是:如果你打算手动做任何触发器正在做的事情,那么他们通过保存往返来提高性能。
更进一步:如果您使用存储过程并且无论如何都在一个服务器内运行,那么优势就会消失。
所以这取决于你如何看待它。
答案 3 :(得分:0)
表现在什么?事件发生后触发器将在DB上执行更新,因此系统用户甚至不知道它正在进行中。它发生在后台。
你的问题很难理解。