1

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

决定我们应该创建一个只包含我们需要的数据的新表,然后将旧表重命名为备份并将新表重命名为原始表。

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

我们正在考虑从对象浏览器生成一个脚本,使用查找/替换重命名所有对象名称,创建相同结构的表,填充数据,将原始表重命名为备份,然后将新表和所有对象重命名为原始表中包含的对象桌子。

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

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

4

2 回答 2

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]
于 2018-06-04T09:42:53.997 回答
0

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

  1. 编写当前表的脚本,我们将其命名为 [X],并将其重命名为 [Y]。
  2. 运行步骤 1 中的脚本并创建一个新表,仍然为 [X]
  3. 将 [Y] 中需要的记录插入此 [X],它应该小于 800M 行的 5%。(它仍然是 ~40M 行,因为 800M X 5% = 40M)。当然,为了加快这一步,您可以考虑切换恢复模式SIMPLE和/或禁用触发器/NC 索引等。一旦工作完成,恢复到原始设置。
  4. 完成此操作后,设置一个定期作业,通过每天将不需要的记录移动到 [Y] 来维护新的 [X] 表。

但最终的解决方案是将您的 sql server 2008 升级到 SQL Server 2016+,在 SQL Server 2016 SP1 中,即使是标准版也具有分区功能,并且该分区方法将使您的生活更轻松(尽管是另一个主题)

于 2018-05-30T17:55:12.813 回答