sql-server - 如何在 SQL 2005 中删除记录并检查事务日志

标签 sql-server tsql

我正在运行以下存储过程来删除大量记录。据我了解,DELETE 语句会写入事务日志,删除许多行会使日志增长。

我已经研究了创建表并插入记录以保留然后截断源的其他选项,此方法对我不起作用。

如何使下面的存储过程更加高效,同时确保事务日志不会不必要地增长?

CREATE PROCEDURE [dbo].[ClearLog] 
(
  @Age int = 30
)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

  -- DELETE ERRORLOG
  WHILE EXISTS ( SELECT [LogId]  FROM [dbo].[Error_Log] WHERE DATEDIFF( dd, [TimeStamp], GETDATE() ) > @Age )
   BEGIN
    SET ROWCOUNT 10000
    DELETE [dbo].[Error_Log] WHERE DATEDIFF( dd, [TimeStamp], GETDATE() ) > @Age

    WAITFOR DELAY '00:00:01'
    SET ROWCOUNT 0
   END
END

最佳答案

这是我的做法:

CREATE PROCEDURE [dbo].[ClearLog] (  
@Age int = 30)
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @d DATETIME
        , @batch INT;
    SET @batch = 10000;
    SET @d = DATEADD( dd, -@Age, GETDATE() )
    WHILE (1=1)
    BEGIN
        DELETE TOP (@batch) [dbo].[Error_Log]  
        WHERE [Timestamp] < @d;
        IF (0 = @@ROWCOUNT)
            BREAK
    END
END
  • 进行 Tiemstamp 比较 SARGable
  • 在批处理开始时分隔 GETDATE() 以产生一致的运行(否则它可能会在无限循环中阻塞,因为新记录“老化”,而旧记录被删除)。
  • 使用 TOP 代替 SET ROWCOUNT( deprecated :使用 SET ROWCOUNT 不会影响下一版本 SQL Server 中的 DELETE、INSERT 和 UPDATE 语句。)
  • 检查@@ROWCOUNT来打破循环而不是多余的SELECT

关于sql-server - 如何在 SQL 2005 中删除记录并检查事务日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1401599/

相关文章:

sql - '-' 附近的语法不正确

sql-server - 如何完成 Azure 发送的推荐 - 'An Azure Active Directory administrator should be provisioned for SQL servers'?

powershell - 如何编写PowerShell脚本来还原具有多个.trn文件的数据库以还原到某个时间点?

sql - SQL中的偶数或奇数

sql-server - 多列运行总计

sql - 如何构建查询以仅提供与 T-SQL 中 CSV ID 列表中的所有值匹配的行

sql-server - 使用 SSIS 创建并写入文本文件

sql-server - 如何在 SQL 查询中获取平均日期

sql - T-SQL "Dynamic"加入

sql - 将四列插入一列