sql - SQL SERVER 中的清除表:删除时间
问题描述
我负责一个 OLAP 数据库,我注意到一些清理会带来一些好处。我的第一次分析遇到了大约 50 个表中要删除的 500Millions 行。这通常占每个表的 70%。
我遇到了一些解决方案,我需要使用 tmp 表,删除原来的表,然后再将它带回来......但我有太多的依赖关系,我不想冒险走这条路。
所以我选择了另一个解决方案:一点一点地删除,所以没有表锁。
这是我在堆栈溢出中找到的代码,我试图改进删除 4000 x 4000 行。
set statistics time off
DECLARE @BATCHSIZE INT, @WAITFORVAL VARCHAR(8), @ITERATION INT, @TOTALROWS
INT, @MAXRUNTIME VARCHAR(8), @BSTOPATMAXTIME BIT, @MSG VARCHAR(500)
SET DEADLOCK_PRIORITY LOW;
SET @BATCHSIZE = 4000
SET @WAITFORVAL = '00:00:10'
SET @MAXRUNTIME = '18:00:00' -- 6 PM
SET @BSTOPATMAXTIME = 1 -- ENFORCE 6 PM STOP TIME
SET @ITERATION = 0 -- LEAVE THIS
SET @TOTALROWS = 0 -- LEAVE THIS
Begin TRY
WHILE @BATCHSIZE>0
BEGIN
-- IF @BSTOPATMAXTIME = 1, THEN WE'LL STOP THE WHOLE JOB AT A SET TIME...
IF (CONVERT(VARCHAR(8),GETDATE(),108) >= @MAXRUNTIME AND @BSTOPATMAXTIME=1) OR @ITERATION >2000
BEGIN
Return;
END
DELETE top (@BATCHSIZE)
FROM FacY where IdDimX not in (select IdDimX from vwX)
SET @BATCHSIZE=@@ROWCOUNT
SET @ITERATION=@ITERATION+1
SET @TOTALROWS=@TOTALROWS+@BATCHSIZE
SET @MSG = 'Iteration: ' + CAST(@ITERATION AS VARCHAR) + ' Total deletes:' + CAST(@TOTALROWS AS VARCHAR)
RAISERROR (@MSG, 0, 1) WITH NOWAIT
--COMMIT TRANSACTION;
END
end TRY
BEGIN CATCH
IF @@ERROR <> 0
AND @@TRANCOUNT > 0
BEGIN
PRINT 'There is an error occured. The database update failed.';
ROLLBACK TRANSACTION;
END;
END CATCH;
所以这大约花了。在 30 分钟到 1 小时之间删除 400 万行。
相反,我现在尝试删除 100 000 行,它在 1 分钟内完成,然后我尝试了 100 万行,它在 5-6 分钟内完成。然后我又去了 1000 万行,花了 15 分钟。(但 50GB 的日志已满 60%,所以我认为这是极限)
所以现在我想知道如果我最终删除大块不是更好吗?因为这需要很多时间。
而我不明白的是为什么删除大块需要更少的时间?
感谢您的帮助
解决方案
推荐阅读
- postgresql - Spark streaming jdbc 在数据到来时读取流 - 数据源 jdbc 不支持流式读取
- python-3.x - * 在 np 数组形状的参数中是什么意思?例如,np.multiply(*arr.shape)?
- amazon-web-services - AWS IoT 事物连接状态不可靠
- c# - 在后台轮询其他 API 并保存数据的类的最佳方法
- html - 按钮中的中心图像
- r - 运行闪亮的交互式文档时如何避免重新加载包?
- python - 你可以在python中将一个数字四舍五入到一个数字的倍数吗?
- html - 将固定位置图像始终保持在视口中心
- python - 每次都下载Visual Studio代码python语言服务器?
- c# - 用户单击集合视图时如何显示图像