使用包含数据子集的表副本替换,而不是从表中删除 - 最佳方法

时间:2018-05-30 15:37:19

标签: sql-server sql-server-2008 vldb

我们有一个包含800M行和93列的表,需要删除历史数据。要删除的数据组成> 95%。到目前为止,批量删除的尝试都失败了,估计至少需要一周才能完成。现有指标是缓慢的主要原因。删除后删除索引并重建也证明测试速度太慢。

在将旧表重命名为备份并将new重命名为original之前,我们决定创建一个仅包含所需数据的新表。

问题是至少有一百个键,约束和索引。

我们正在考虑从对象浏览器生成脚本,使用find / replace重命名所有对象名称,创建结构相同的表,填充数据,将原始文件重命名为备份,然后将新表和所有对象重命名为包含的对象原表。

这是一个关于实时数据库的关键表,只需几个小时即可完成整个过程。如此多的手动重命令让我们感到紧张,因为当客户开始交易时不会有任何问题。

最可靠的方法是什么?是否有自动化流程来执行此程序?任何建议都赞赏。

2 个答案:

答案 0 :(得分:0)

我会在您停机期间执行以下操作(即数据库未被任何人使用):

  1. 将当前表格写出来,让它调用它[X],并将其重命名为 [Y]。
  2. 在步骤1中运行脚本并创建一个新表,仍为[X]
  3. 从[Y]中插入所需的记录[X],它应该是< 800M行的5%。 (它仍然是~40M行,因为800M X 5%= 40M)。当然,要加快这一步,您可以考虑切换 恢复模型到SIMPLE和/或禁用触发器/ NC索引等。 完成工作后,恢复原始设置。
  4. 完成此操作后,设置一个常规作业,通过每天将不需要的记录移动到[Y]来维护新的[X]表。
  5. 但最终的解决方案是在SQL Server 2016 SP1中将您的sql server 2008升级到SQL Server 2016+,即使标准版具有分区功能,该分区方法也会让您的生活更轻松(尽管另一个主题)< / p>

答案 1 :(得分:0)

由于对所需的大量重命名和表的关键性质感到紧张,我已经能够测试下面的脚本来重命名所有约束,索引,触发器,默认值等。因此将创建一个复制脚本,重命名原始,然后运行复制脚本:

select o.name as [Name],  o1.type as [Type], 'EXEC sp_rename N''' + o1.name + ''', '''  + o1.name + N'_OLD'''
from sys.objects o
inner join sys.objects o1 on o1.parent_object_id = o.object_id
where o.name = 'Product_history'
union
select o.name as [Name], 'I' as [Type], 'EXEC sp_rename N''PRODUCT_HISTORY.' + i.name + ''', '''  + i.name + N'_OLD'''
from sys.objects o
inner join sys.indexes i on i.object_id = o.object_id
where o.name = 'Product_history' and i.name is not null  AND i.is_primary_key = 0
order by [Type], [Name]


select o.name as [Name],  o1.type as [Type], 'EXEC sp_rename N''' + o1.name + ''', '''  + LEFT(o1.name,LEN(o1.name)-4) + N''''
from sys.objects o
inner join sys.objects o1 on o1.parent_object_id = o.object_id
where o.name = 'Product_history'
union
select o.name as [Name], 'I' as [Type], 'EXEC sp_rename N''PRODUCT_HISTORY.' + i.name + ''', '''  + LEFT(i.name,LEN(i.name)-4) + N''''
from sys.objects o
inner join sys.indexes i on i.object_id = o.object_id
where o.name = 'Product_history' and i.name is not null  AND i.is_primary_key = 0
order by [Type], [Name]