我需要通过将数据移动到新表来存档 SQL Server 2012 中的大量信息,但不阻止其他用户使用原始表。使用 T-SQL 循环语句执行此操作是最好的方法吗?还是有更好的方法?
答案1
如何按照你要求的方式去做:
创建第二个表,与第一个表完全相同。
找到一个列(可能是基于日期的列?),然后使用它来将合理数量的数据复制到第二个表中。(“合理”是一个基于数据大小和所需时间的任意值。)然后运行第二个查询以从第一个表中删除相同的数据。请注意,第二个查询是阻塞查询,这意味着它将阻止任何人使用该表。换句话说,第二个查询是问题所在,而不是第一个查询。
我最终做的是:
- 创建临时表(id intidentity,第二列以第一个表的PK命名,并且具有相同或兼容的数据类型)。
- 选择主键,其中日期介于(范围)之间,放入临时表中
- 循环遍历临时表(选择自动编号,从第一个表中删除 PK = 临时表中的 PK)。
这比正常删除花费的时间更长,但不会阻塞。
我建议这样做:
这就是我要开始做的事情:
- 创建新表,为空但其他方面与旧表完全相同。
- 创建作业以重命名旧表(从 data 到 data-201412)并使用旧名称重命名新表(从 data-new 到 data)。
- 安排它在我参加新年晚会时运行。
(实际上,我即将拥有一个全新的数据库,但已经足够接近了。)