我们有一个包含800M行和93列的表,需要删除历史数据。要删除的数据组成> 95%。到目前为止,批量删除的尝试都失败了,估计至少需要一周才能完成。现有指标是缓慢的主要原因。删除后删除索引并重建也证明测试速度太慢。
在将旧表重命名为备份并将new重命名为original之前,我们决定创建一个仅包含所需数据的新表。
问题是至少有一百个键,约束和索引。
我们正在考虑从对象浏览器生成脚本,使用find / replace重命名所有对象名称,创建结构相同的表,填充数据,将原始文件重命名为备份,然后将新表和所有对象重命名为包含的对象原表。
这是一个关于实时数据库的关键表,只需几个小时即可完成整个过程。如此多的手动重命令让我们感到紧张,因为当客户开始交易时不会有任何问题。
最可靠的方法是什么?是否有自动化流程来执行此程序?任何建议都赞赏。
答案 0 :(得分:0)
我会在您停机期间执行以下操作(即数据库未被任何人使用):
SIMPLE
和/或禁用触发器/ NC索引等。
完成工作后,恢复原始设置。但最终的解决方案是在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]