sql - 如何删除SQL Server中的大量数据而不丢失数据?

标签 sql sql-server performance sql-server-2012 sql-delete

我在日常过程中一直在处理数百万条数据删除。

基本上我有 4 张 table 。

Table_A
Table_B
Table_C
Table_D

我正在尝试删除所有表中超过 10 天的数据。

可能我会在每个表中删除大约一百万个。我创建了一个存储过程来执行这些操作。

我删除数据所遵循的步骤是

第 1 步:将最近几天的数据(我必须保留的数据)移至临时表

select * into Table_A_Temp
from Table_A
where <<where clause last 10 days to till date>>

第2步:将主表重命名为旧表(包含全天数据的表)

exec sp_rename 'Table_A', 'Table_A_Old'

第 3 步:将临时表重命名为主表(包含最近几天至今数据的表)

exec sp_rename 'Table_A_temp', 'Table_A'

第4步:在复制过程中是否插入任何新数据,查询临时表的时间范围

Insert into Table_A
select * from Table_A_old

第 5 步:删除旧表

DROP TABLE Table_A_old

第6步:在主表中创建键和约束(意味着重命名的表)

code to create primary keys and constraints

问题:

如果我在存储过程运行时不断地将数据插入表中,我会丢失数据几秒钟。

情况1:重命名表时

当我将 main 重命名为 old 并将临时表重命名为 main

我收到无效对象错误(该表存在错误)

案例2:我的两个表有外键关系

如果我在创建约束和键之前插入数据,则会收到相关错误。

如何正确处理和删除数据而不丢失数据。

请提供最佳实践建议。

最佳答案

为了避免丢失数据,我只会删除它们所在的记录,而不是创建/重命名表。 SQL Server 会为您处理插入和删除操作,以防止数据丢失。有几种方法可以做到这一点,下面是一个建议。

第 1 步:获取要删除的行的 ID/标识符,并将其存储在临时表中。

SELECT Id 
INTO #TEMP_Table_A_RowsToDelete
FROM Table_A
WHERE <<your_date_column <= 10 days ago>>

然后您将拥有一个临时表#TEMP_Table_A_RowsToDelete,其中包含要删除的行的Id值。

第 2 步(可选):使用此表删除引用表中的任何相关数据(如果存在)。

DELETE t1
FROM ForeignKeyTable t1
INNER JOIN #TEMP_Table_A_RowsToDelete t2
  ON t1.[ForeignKeyColumn] = t2.Id

这将删除链接到主表上主键的表中的所有相关数据。您将对所有链接表重复此操作,以确保外键约束不会阻止您删除父表中的行。

第 3 步:从主表中删除行。

DELETE t1
FROM Table_A t1
INNER JOIN #TEMP_Table_A_RowsToDelete t2
  ON t1.[Id] = t2.Id

这将根据您在第 1 步中添加到临时表中的内容删除超过 10 天的行。如果您在第 2 步中删除了所有相关数据,这不会导致问题。

您需要对列表中的每个表格重复上述步骤。

关于sql - 如何删除SQL Server中的大量数据而不丢失数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55844050/

相关文章:

sql - 在制定 Sql 查询时您是如何思考的?它是一种体验还是一种理念?

sql - 如何在 Azure SQL 数据库中存储字典? ( swift )

c# - 直接通过C#中的实例连接

javascript - 表行排序和字符串性能

sql - 如何根据列值创建重复行

sql - 如何根据条件选择列?

SQL子选择如果存在

仅使用通配符 (%) 作为值的 SQL LIKE 性能

MySql性能问题

使用 RDTSC 在 C 中计算 CPU 频率总是返回 0