103 lines
3.4 KiB
Transact-SQL
103 lines
3.4 KiB
Transact-SQL
|
|||
|
|
/*定期删除数据存储过程*/
|
||
|
|
CREATE PROCEDURE sp_DeleteOldData_Batch
|
||
|
|
@BatchSize INT = 10000, -- 每批删除的行数
|
||
|
|
@DelayMs INT = 100 -- 每批之间的延迟(毫秒)
|
||
|
|
AS
|
||
|
|
BEGIN
|
||
|
|
SET NOCOUNT ON;
|
||
|
|
|
||
|
|
DECLARE @TotalDeleted INT;
|
||
|
|
DECLARE @BatchDeleted INT;
|
||
|
|
DECLARE @CutoffDate DATETIME;
|
||
|
|
DECLARE @StartTime DATETIME;
|
||
|
|
DECLARE @DelayTime VARCHAR(12);
|
||
|
|
|
||
|
|
SET @CutoffDate = DATEADD(YEAR, -1, GETDATE());
|
||
|
|
SET @StartTime = GETDATE();
|
||
|
|
|
||
|
|
PRINT '开始删除一年前的数据,截止时间:' + CONVERT(VARCHAR, @CutoffDate, 120);
|
||
|
|
|
||
|
|
BEGIN TRY
|
||
|
|
-- ============ 删除 BlankingData ============
|
||
|
|
SET @TotalDeleted = 0;
|
||
|
|
SET @BatchDeleted = 1;
|
||
|
|
|
||
|
|
PRINT '开始删除 BlankingData 表数据...';
|
||
|
|
|
||
|
|
WHILE @BatchDeleted > 0
|
||
|
|
BEGIN
|
||
|
|
DELETE TOP (@BatchSize) FROM dbo.BlankingData
|
||
|
|
WHERE OutTime < @CutoffDate;
|
||
|
|
|
||
|
|
SET @BatchDeleted = @@ROWCOUNT;
|
||
|
|
SET @TotalDeleted = @TotalDeleted + @BatchDeleted;
|
||
|
|
|
||
|
|
-- 每批之间短暂延迟,减少锁争用
|
||
|
|
IF @BatchDeleted > 0 AND @DelayMs > 0
|
||
|
|
BEGIN
|
||
|
|
SET @DelayTime = '00:00:00.' + RIGHT('000' + CAST(@DelayMs AS VARCHAR(3)), 3);
|
||
|
|
WAITFOR DELAY @DelayTime;
|
||
|
|
END
|
||
|
|
END
|
||
|
|
|
||
|
|
PRINT 'BlankingData 表删除完成,共删除 ' + CAST(@TotalDeleted AS VARCHAR) + ' 行。';
|
||
|
|
|
||
|
|
|
||
|
|
-- ============ 删除 FeedingData ============
|
||
|
|
SET @TotalDeleted = 0;
|
||
|
|
SET @BatchDeleted = 1;
|
||
|
|
|
||
|
|
PRINT '开始删除 FeedingData 表数据...';
|
||
|
|
|
||
|
|
WHILE @BatchDeleted > 0
|
||
|
|
BEGIN
|
||
|
|
DELETE TOP (@BatchSize) FROM dbo.FeedingData
|
||
|
|
WHERE CreateTime < @CutoffDate;
|
||
|
|
|
||
|
|
SET @BatchDeleted = @@ROWCOUNT;
|
||
|
|
SET @TotalDeleted = @TotalDeleted + @BatchDeleted;
|
||
|
|
|
||
|
|
IF @BatchDeleted > 0 AND @DelayMs > 0
|
||
|
|
BEGIN
|
||
|
|
SET @DelayTime = '00:00:00.' + RIGHT('000' + CAST(@DelayMs AS VARCHAR(3)), 3);
|
||
|
|
WAITFOR DELAY @DelayTime;
|
||
|
|
END
|
||
|
|
END
|
||
|
|
|
||
|
|
PRINT 'FeedingData 表删除完成,共删除 ' + CAST(@TotalDeleted AS VARCHAR) + ' 行。';
|
||
|
|
|
||
|
|
|
||
|
|
-- ============ 删除 tb_alarm ============
|
||
|
|
SET @TotalDeleted = 0;
|
||
|
|
SET @BatchDeleted = 1;
|
||
|
|
|
||
|
|
PRINT '开始删除 tb_alarm 表数据...';
|
||
|
|
|
||
|
|
WHILE @BatchDeleted > 0
|
||
|
|
BEGIN
|
||
|
|
DELETE TOP (@BatchSize) FROM dbo.tb_alarm
|
||
|
|
WHERE EndTime < @CutoffDate;
|
||
|
|
|
||
|
|
SET @BatchDeleted = @@ROWCOUNT;
|
||
|
|
SET @TotalDeleted = @TotalDeleted + @BatchDeleted;
|
||
|
|
|
||
|
|
IF @BatchDeleted > 0 AND @DelayMs > 0
|
||
|
|
BEGIN
|
||
|
|
SET @DelayTime = '00:00:00.' + RIGHT('000' + CAST(@DelayMs AS VARCHAR(3)), 3);
|
||
|
|
WAITFOR DELAY @DelayTime;
|
||
|
|
END
|
||
|
|
END
|
||
|
|
|
||
|
|
PRINT 'tb_alarm 表删除完成,共删除 ' + CAST(@TotalDeleted AS VARCHAR) + ' 行。';
|
||
|
|
|
||
|
|
PRINT '所有表数据删除完成,总耗时:' +
|
||
|
|
CAST(DATEDIFF(SECOND, @StartTime, GETDATE()) AS VARCHAR) + ' 秒。';
|
||
|
|
|
||
|
|
END TRY
|
||
|
|
BEGIN CATCH
|
||
|
|
PRINT '数据删除失败:' + ERROR_MESSAGE();
|
||
|
|
THROW;
|
||
|
|
END CATCH
|
||
|
|
END
|
||
|
|
GO
|