这是我的情景:
我有一个简单的存储过程,它从表中删除一组特定的行(我们会说大约30k行),然后插入大约相同数量的行。这通常只需要几秒钟;但是,该表上有一个触发器,用于监视插入/删除,并尝试模仿另一台服务器上链接表的内容。
由于触发器,此过程反过来非常慢,并且在此过程中表也被锁定。所以这是我的两个问题:
谢谢!
编辑 - 感谢您的回答;我认为是这样的(不能做上述任何一种情况),但想确定。触发器是很久以前创建的,并且看起来效率不高,所以看起来我的下一步就是进入那个并找出需要什么以及如何改进它。谢谢!
答案 0 :(得分:2)
1)不,你也没有像TRUNCATE或BULK INSERT那样进行最低限度记录的操作
2)不,你会如何防止腐败呢?
答案 1 :(得分:1)
我不会自动认为性能问题是由于日志记录造成的。事实上,触发器可能以导致性能问题的方式编写。我鼓励您修改原始问题并显示触发器的代码。
答案 2 :(得分:1)
修改数据时无法关闭事务完整性。使用select * from table (nolock)时,可以忽略锁定;但是,您需要非常小心并确保您的应用程序可以处理脏读。
答案 3 :(得分:1)
它对您的触发器没有帮助,但锁定问题的解决方案是以较小批量执行事务。
而不是
DELETE FROM Table WHERE <Condition>
执行类似
的操作WHILE EXISTS ( SELECT * FROM table WHERE <condition to delete>)
BEGIN
SET ROWCOUNT 1000
DELETE FROM Table WHERE <Condition>
SET ROWCOUNT 0
END
答案 4 :(得分:1)
您可以暂时禁用触发器,运行触发器,然后以更有效的方式执行触发器执行的操作。
-- disable trigger
ALTER TABLE [Table] DISABLE TRIGGER [Trigger]
GO
-- execute your proc
EXEC spProc
GO
-- do more stuff to clean up / sync with other server
GO
-- enable trigger
ALTER TABLE [Table] ENABLE TRIGGER [Trigger]
GO