Joe*_*eky 11 sql-server delete t-sql jobs
我有一张有点失控的桌子。我本身不是 DBA,但似乎记得一次性删除大量行会导致事务日志问题,在删除过程中妨碍整体系统性能等......
有没有一种有效的方法可以让我创建一个小批量删除记录以过度阻碍其他访问/性能并防止事务日志出现问题的作业?
这个过程可能会很慢,这会有所不同
对于其他上下文,删除条件将基于诸如...之类的内容where x like '%blah%'
。此外,还有 1 个聚集索引和 5 个非聚集索引。
Bla*_*ler 12
你可以把它分成几块——循环删除;每次删除迭代都是自己的事务,然后在每次循环迭代结束时清除日志。找到最佳块大小需要一些测试。
我建议你看看 Aaron Bertrand 的这篇文章,他解释了细节并针对不同场景运行测试,以显示影响(持续时间、事务日志):http : //sqlperformance.com/2013/03/io-子系统/块删除
至于where x like '%blah%'
删除条件 - 它会使查询不可搜索(不能利用索引进行索引查找)。所以即使你有一个索引来支持 column x
,它也将是一个扫描。
这方面的资源:
这相当简单。这是一个让您进行测试的框架。
CREATE TABLE #DelTest (ID INT IDENTITY, name NVARCHAR(128));
INSERT INTO #DelTest (name) SELECT name FROM sys.objects;
SELECT COUNT(*) TableNamesContainingSys FROM deltest WHERE name LIKE '%sys%';
go
DECLARE @HowMany INT;
DECLARE @RowsTouched INT;
SET @RowsTouched = 1;
SET @HowMany = 5;
WHILE @RowsTouched > 0
BEGIN
DELETE TOP (@HowMany)
FROM #DelTest
WHERE name LIKE '%sys%';
SET @RowsTouched = @@ROWCOUNT;
END;
SELECT COUNT(*) TableNamesContainingSys FROM #DelTest WHERE name LIKE '%sys%';
DROP TABLE #DelTest;
Run Code Online (Sandbox Code Playgroud)
编辑:当然,众所周知,打开通配符搜索对于查找行来说非常糟糕,因为必须搜索整个列。此外,正如 Aaron 的帖子中所指出的,您还需要管理日志,无论是处于 SIMPLE 模式还是进行日志备份以防止日志文件过度增长。