代码之家  ›  专栏  ›  技术社区  ›  John

MS-SQL 2000:在存储过程中关闭日志记录

  •  2
  • John  · 技术社区  · 17 年前

    以下是我的场景:

    我有一个简单的存储过程,它从表中删除一组特定的行(我们将说大约30K行),然后插入大约相同数量的行。这通常只需要几秒钟;但是,表上有一个触发器,用于监视插入/删除,并尝试模拟在另一台服务器上的链接表所发生的情况。

    由于触发器的原因,此进程的速度将不可恢复地缓慢,并且在此过程中表也将被锁定。下面是我的两个问题:

    1. 我猜测经济放缓的一个相当大的部分原因是交易日志。是否有一种方法可以在存储过程中指定我不希望记录过程中的内容?
    2. 在整个过程中,是否有一种方法可以在不锁定表的情况下执行“删除自”和“插入到”命令?

    谢谢!

    编辑 -谢谢你的回答;我想是这样的(不能做上面的任何一个),但我想确定。触发器是很久以前创建的,看起来不是很有效,所以看起来我的下一步将是深入研究,找出需要什么以及如何改进。谢谢!

    5 回复  |  直到 17 年前
        1
  •  2
  •   SQLMenace    17 年前

    1)不,您也没有执行最小日志记录操作,如截断或大容量插入。

    2)不,您如何防止腐败?

        2
  •  1
  •   George Mastros    17 年前

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

        3
  •  1
  •   JoshBerke    17 年前

    修改数据时不能关闭事务完整性。使用SELECT*FROM表选择数据时可以忽略锁 (诺洛克) 但是,您需要非常小心,并确保您的应用程序能够处理脏读。

        4
  •  1
  •   BradC    17 年前

    它对您的触发器没有帮助,但是锁定问题的解决方案是以较小的批处理方式执行事务。

    而不是

    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
    
        5
  •  1
  •   DJ.    17 年前

    您可以临时禁用触发器,运行您的过程,然后以更有效的方式执行触发器正在执行的任何操作。

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