如何使触发器具备良好的性能?

通过SET NOCOUNT ON 命令使触发器具备更好的性能

  触发器使得表和跨数据库之间数据的自动同步行为变得简单。但是,那些一眼看上去不是很明显的东西却会对他们的性能造成显著的影响。这里我将描述一个命令,他可用来减少一些不可预料的问题产生的影响 。

  以反复被触发的Insert触发器为例,尤其是当使用Insert INTO语句用来进行大量插入操作时。在语句执行的过程中,当触发器一遍又一遍的被激发的情况下,触发器将会对每个Insert动作发布DONE_IN_PROC消息,这会使速度明显下降。

 

  尤其是当触发器作为一个预定了时间的SQL Server Agent工作的结果而被触发时,这个速度的减慢是特别明显的 。SQL Server Agent自动在每个DONE_IN_PROC 信号后强加一个延迟,以避免服务器拥塞 。假如您想通过查询分析器来运行同样的一组命令,由于没有强加这样的延迟,他的执行将会快得多。假如您通过查询分析器运行这样的查询并且查看多个语句产生的多个”n rows affected”,那么很有可能查询会被反复执行,并且触发器也被重新触发多次,这比他实际需要的次数要多很多。

  要关掉DONE_IN_PROC消息,能够在触发器语句的开始用SET NOCOUNT ON命令。大多数时候,以任何方式对行进行计数都是无需的。假如确实需要,您能够考虑重新构造命令来触发触发器(或是触发器本身),这样就使任何的改变作为一个命令完成。假如这个进程仍然花了很长时间,为了简单起见,您应该重新想一个方法来激发触发器。

在触发器中已经知道的改善性能的方法有如下3点:
1、在触发器中使用SET NOCOUNT ON
2、用AFTER,而少用INSTEAD OF 类型的触发器
3、尽量少用游标
如果哪位仁兄还知道其他方法的话,请告知,谢谢!

posted @ 2008-10-03 14:14  月亮不合眼  阅读(635)  评论(0编辑  收藏  举报