如何在具有多个表的SQL Server中执行数据归档?
假设我有一个包含许多表的数据库。我想对某些表执行数据归档,即创建一个与新表具有相同结构(相同的约束、索引、列、触发器等)的表,并将特定数据从旧表插入到新表中 例如,当前表包含2008-2017年的数据,我只想将2010-2017年的数据移动到新表中。然后,我可以删除旧表,并使用与旧表类似的命名约定重命名新表如何在具有多个表的SQL Server中执行数据归档?,sql,sql-server,ssms,Sql,Sql Server,Ssms,假设我有一个包含许多表的数据库。我想对某些表执行数据归档,即创建一个与新表具有相同结构(相同的约束、索引、列、触发器等)的表,并将特定数据从旧表插入到新表中 例如,当前表包含2008-2017年的数据,我只想将2010-2017年的数据移动到新表中。然后,我可以删除旧表,并使用与旧表类似的命名约定重命名新表 我应该如何处理这个问题?对于您所讨论的克隆重命名丢弃逻辑,基本原理非常简单。实际上,这是一个好主意的唯一时间是,如果您有一个包含大量数据的表,而您负担不起停机时间或阻塞,并且您只计划执行这一
我应该如何处理这个问题?对于您所讨论的克隆重命名丢弃逻辑,基本原理非常简单。实际上,这是一个好主意的唯一时间是,如果您有一个包含大量数据的表,而您负担不起停机时间或阻塞,并且您只计划执行这一次。该过程如下所示:
sp\u将原始表从(例如)myTable
重命名为myTable\u OLD
(只是为了将其与实际表区分开来)。然后sp\u重命名
克隆表从(例如)myTable\u克隆
到myTable
- 标识列:如果您的表上有任何标识,则必须使用
然后重新设置标识的种子,以便在旧标识停止的位置拾取Identity\u insert on
- 当你这样做的时候,你有没有把桌子挡住的奢侈?通常,如果您需要执行这类操作,答案是否定的。我发现效果很好的方法是使用
插入我需要的所有行,或者不管您如何执行,都可以减轻从原始表中选择的影响。然后,在我移动了99%的数据之后,我将打开一个事务,阻塞原始表,只插入自数据移动以来进入的新数据,然后执行(nolock)
操作sp_rename
- 这样,您就不会对大部分数据移动锁定任何内容,而只会在原始insert和
sp_rename
- 如何确定“自开始”中的内容将取决于表的结构。如果您有一个标识或一个日期戳列,您可能只需要选择在您移动的字段的最大值之后的行。如果你的桌子上没有一些你可以轻松勾住的东西,你可能需要发挥创造力
- 这样,您就不会对大部分数据移动锁定任何内容,而只会在原始insert和
如果删除导致阻塞过多,还可以设置快照隔离之类的设置,它基本上将行的历史版本存储在
tempdb
中。任何设置隔离级别读取提交快照的查询都将读取这些更改前的行,而不是在“real”表上争用锁。然后,您可以对hearts内容进行批量删除,并知道任何命中表的查询都不会被删除(或任何其他DML操作)阻止,因为它们将读取删除前快照,或者读取删除后快照。他们不会等待进程内删除来确定它是提交还是回滚。不幸的是,这也并非没有缺点。对于大型数据集,它可能会给tempdb带来很大的负担,也可能有点像一个黑匣子。它还需要DBA的认可。右键单击数据库并使用生成脚本。单击最后一个屏幕上的Advanced(高级)以包括触发器、约束等。更详细地说,我目前正在使用此方法,但正确的数据归档过程是什么?我是删除旧表,保留新表并将其重命名为旧表名,还是只保留它?有不同的方法。大多数情况下,您希望插入到新表(col1、col2等)中,从旧表中选择col1、col2等,其中dateField>='2010-01-01',因此最终结果是您删除了后面两年的数据?是的,例如,我不想保留早于2015年的数据。详细信息非常丰富。谢谢但我想既然我已经完成了这个删除和重命名方法的一半,。我会坚持下去。只是一个问题,我能这样做吗。我使用insert into TableNew…从表中选择要保留的数据。然后我是否删除该表,然后继续将主键、索引、触发器等重命名为表中的主键、索引、触发器等?正如我所知,你不能有类似的命名约定