通过从 SQL Server 中的当前日期删除超过 180 天的所有记录来清除
Posted
技术标签:
【中文标题】通过从 SQL Server 中的当前日期删除超过 180 天的所有记录来清除【英文标题】:Purge by deleting all records older than 180 days from the current date in SQL Server 【发布时间】:2016-02-05 16:50:27 【问题描述】:在 SQL Server 2008 R2 中,我有一个包含超过 10 亿行的表(数据库大小为 450 GB),我想通过删除从当前日期算起超过 180 天的所有记录来清除它。这里的任何帮助将不胜感激!
我正在使用以下查询:
DELETE FROM table name
WHERE column name < '2015-01-01'
但这需要太多时间。是否有任何维护计划或任何查询,以便我可以快速删除数据?
【问题讨论】:
超过 180 天的行的百分比有多大?也许将它们移动到不同的表,截断原始表并重命名表/将行复制回来更容易。否则,您可能希望批量删除较少数量的行 无论你最终做什么,无论如何都必须使用某种日期过滤,并最终花费相同的时间。虽然也许去另一个方向更快。将任何记录>= 2015-01-01
复制到另一个表,然后删除原始记录 - 特别是如果较新的记录只是整个十亿记录的一小部分。
亲爱的朋友们....在我的数据库中添加了图像行大小和数据大小。
什么版本的 SQL Server?标准?企业?
【参考方案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;
【讨论】:
感谢您的帮助.....但是这个系统日志,安全数据每天都在该数据库中。所以我们需要每天删除数据。 @ShivprasadWaychal 您可以每天安排在不必访问数据的时间。我回答了您问题的这一部分:“是否有任何 [...] 任何查询以便我可以快速删除数据?”。但我同意 Gordon 的回答,也许这会是一个更好的长期解决方案。 @ShivprasadWaychal 但回到我的答案。一旦您像我的回答一样以“快速方式”删除了整个历史记录,每天的删除将不再需要太多时间。您将安排每日删除查询 - 正常方式,简单的DELETE FROM your_table WHERE date_col<DATEADD(DAY, -180, GETDATE())
。如果日期列上有合适的 INDEX,则 DELETE 语句将不再花费太多时间。【参考方案2】:
是的。当您想定期删除旧记录时,正确的方法是使用分区。
这是一个很大的话题。您可以通过documentation开始了解它。
关键思想是每个分区都是数据的单独存储。无需记录即可删除整个分区,产生的开销非常小。
在您的情况下,我可能会建议每个月使用一个单独的分区。
【讨论】:
【参考方案3】:这需要很长时间,因为(部分)所有这些删除都将进入一个庞大的事务。您需要将其分解为更小的块(事务)并定期提交。这仍然需要很长时间,但对您的服务器的影响会减少。请参阅https://***.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
如果你的表是分区的,它会更容易和更快。
【讨论】:
以上是关于通过从 SQL Server 中的当前日期删除超过 180 天的所有记录来清除的主要内容,如果未能解决你的问题,请参考以下文章
添加列通过从sql Server中的另一个表中选择所有项目来选择表
powershell 通过从文件名中删除“&”来重命名目录中的文件。