在SQL Server 2008 R2中,我有一个表(数据库大小为450 GB),行数超过十亿,我想通过删除从当前日期算起的所有180天以上的记录来清除。任何帮助在这里将不胜感激!
我使用以下查询:
DELETE FROM table name
WHERE column name < '2015-01-01'
但这花费了太多时间。是否有任何维护计划或任何查询,以便我可以快速删除数据?
答案 0 :(得分:1)
是。如果您想要定期删除旧的记录,那么正确的方法是使用分区。
这是一个很大的话题。您可以通过documentation开始了解它。
关键思想是每个分区都是数据的单独存储。可以在不进行日志记录的情况下删除整个分区,从而产生很少的开销。
在您的情况下,我可能建议每个月单独分区。
答案 1 :(得分:1)
它花了很长时间,因为(部分)所有这些删除都进入了一个巨大的交易。您需要将其分解为更小的块(事务)并定期提交。它仍然需要很长时间,但对服务器的影响将会减少。请参阅https://stackoverflow.com/a/28324562/1324345及其引用的博客文章http://sqlperformance.com/2013/03/io-subsystem/chunk-deletes
SET NOCOUNT ON;
DECLARE @r INT;
SET @r = 1;
WHILE @r > 0
BEGIN
BEGIN TRANSACTION;
DELETE TOP (100000) -- this will change
table
WHERE column name < '2015-01-01' ;
SET @r = @@ROWCOUNT;
COMMIT TRANSACTION;
-- CHECKPOINT; -- if simple
-- BACKUP LOG ... -- if full
END
如果您的表已分区,则可以更加轻松快捷。
答案 2 :(得分:1)
可能会节省一些时间的一种方法:
tempdb
的磁盘上有足够的空间)TRUNCATE
表快速删除所有行(此语句将立即执行)INSERT INTO #keep SELECT * FROM table_name WHERE column_name>='2015-01-01';
TRUNCATE TABLE table_name;
INSERT INTO table_name SELECT * FROM #keep;
DROP TABLE #keep;