日期:2014-05-17  浏览次数:20383 次

触发器的效率问题
SQL Server 2005
有一个软件 A ,每分钟向表 T1 里写36条数据(没几个字段),同时在 T1 上有一个触发器,触发条件是Insert,功能是计算本分钟数据和上一分钟数据的差值,存入表T2。
实际应用中发现,每到整分钟的时候,软件A都会非常卡(其他软件如IE、Word不卡),8、9秒钟没反应,然后恢复正常。
测试发现,若关闭触发器,软件A不卡。
请教高人,这种情况,是我触发器的代码写的有问题,还是本身触发器效率就不行?有没有什么办法解决?

另请问:若我用1条insert语句一次性写入36条数据,触发器会触发几次?
------最佳解决方案--------------------
把你的触发器代码贴出来看先。
对于第二个问题,你的36条数据是怎么一次性插入数据库的? 我猜应该是通过循环一条条插入的吧,
每执行一次insert,就触发一次的
------其他解决方案--------------------
这要看楼主你触发器是如何写的,数据是一条一条插入还是作为一个集合去插入。
------其他解决方案--------------------
触发器效率蛮高的,但是性能开销比较大
------其他解决方案--------------------
一个语句执行一次,也就是说,不管你一次insert几条数据,0条,10条,100条,都是触发一次。
你的触发器写的感觉有问题,36条数据,很小的计算量,你写的好的话,毫秒级别的事,你感觉不出来的。
------其他解决方案--------------------
不管insert 几条 只触发一次

但是也可以达到这几条都被用于去计算的效果

关键看你怎么写了。
------其他解决方案--------------------
引用:
功能是计算本分钟数据和上一分钟数据的差值

这里可能问题吧,不要在触发器里做无谓的计算。
触发器就负责把变化前的值放到T2里,要什么计算结果的话基于T2做。
------其他解决方案--------------------
建议不用触发器,特别是数据量很大的表。
------其他解决方案--------------------
triggers fire when any valid event is fired, regardless of whether or not any table rows are affected
The trigger and the statement that fires it are treated as a single transaction, which can be rolled back from within the trigger. If a severe error is detected (for example, insufficient disk space), the entire transaction automatically rolls back. 

Reference:http://msdn.microsoft.com/zh-cn/library/ms178110.aspx