2009-01-14 48 views
2

这里是我的情况:MS-SQL 2000:存储过程中关闭日志

我有一个简单的存储过程,从表中删除一组特定的行(我们会说大约30K行),然后插入大约相同数量的行。这通常应该只需要几秒钟;然而,表上有一个触发器,用于监视插入/删除操作,并试图模仿另一台服务器上的链接表发生了什么。

由于触发器的原因,该过程反过来非常缓慢,并且在此过程中表格也被锁定。所以这里是我的两个问题:

  1. 我猜测减速的一个体面的部分是由于事务日志。有没有办法让我在我的存储过程中指定我不想记录过程中的内容?
  2. 有没有一种方法可以让我在整个过程中不用锁定表而执行'DELETE FROM'和'INSERT INTO'命令?

谢谢!

编辑 - 感谢您的答案;我认为是这种情况(不能够做到上述任何一种),但想确保。触发器很早以前就创建好了,而且看起来效果不是很好,所以看起来我的下一步将是进入并找出需要什么以及如何改进。谢谢!

回答

2

1)没有,也你是不是做像截断或BULK INSERT最低限度记录操作

2)不,你会怎么防止腐败,否则?

1

我不会自动假设性能问题是由于日志记录造成的。事实上,触发器可能会导致性能问题。我鼓励您修改原始问题并显示触发器的代码。

1

修改数据时,您无法关闭事务完整性。当您使用表(nolock)中的select *选择数据时,您可以忽略锁定;但是,您需要非常小心,并确保您的应用程序可以处理脏读操作。

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 
1

您可以暂时禁用触发器,运行PROC,然后为所欲为触发是做一个更有效的方式。

-- 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