SQL MOVE记录到另一个表

Sea*_*ean 8 sql sql-server-2008

我有许多函数可以将记录从一个表移动到另一个表(通常用于存档数据的形式),并且想知道是否存在执行此操作的"最佳实践",或者是一种比我目前使用的更有效的方法.

目前,我正在运行如下:

INSERT INTO archive_table
SELECT [ROWID], [COL1], [COL2]
FROM live_table
WHERE <criteria>

DELETE FROM live_table
WHERE [ROWID] IN
(
   SELECT [ROWID] FROM archive_table
)
Run Code Online (Sandbox Code Playgroud)

这也在SQL性能软件上发出警告,该查询可能导致索引抑制和性能下降; 由于执行了SCAN,而不是SEEK.

值得补充的是,archive_table是live_table的精确副本,除了我们已经从[ROWID]列中删除了标识和主键,并且该表未在"实时"环境中使用,除了具有插入旧数据,如上所述.

[编辑]

似乎亚历克斯的答案为此提供了一个非常简单的解决方案; 关于使用触发器的注释在此实例中无法解决问题,因为事件发生在几天之后,并且标准取决于该期间内的事件.

DELETE 
FROM live_table 
OUTPUT DELETED.* INTO archive_table
WHERE <criteria>
Run Code Online (Sandbox Code Playgroud)

Ver*_*mis 0

值得补充的是,archive_table 是 live_table 的精确副本,但我们已经从 [ROWID] 列中删除了标识和主键,并且该表不在“live”环境中使用,除了具有如所述插入旧数据。

我无法判断您从 archive_table 中删除主键的原因是否是因为您希望在 live_table 中重新使用 ROWID。

如果我正确理解了数据的上下文,并且您希望在数据完成后几天进行归档,则可以通过减少/消除 live_table 中不存在的行的比较来提高查询的性能。基本上,一旦 ROWID 从 live_table 迁移到 archive_table,就没有理由再次查找它。

注意:这假设 ROWID 在 live_table 中没有重复使用并且始终是递增的数字。

INSERT INTO archive_table
SELECT [ROWID], [COL1], [COL2]
FROM live_table
WHERE <criteria>

DELETE FROM live_table
WHERE [ROWID] IN
(
   SELECT [ROWID] FROM archive_table WHERE [ROWID] >= (SELECT MIN(ROWID) FROM live_table)
)
Run Code Online (Sandbox Code Playgroud)

如果重复使用 ROWID。如果数据集中的日期时间字段接近记录的实时或存档时间,则可以将其用作 ROWID 的替代方案。这意味着您只查找要从 live_table 中删除的最近存档的行,而不是整个集合。此外,在 archive_table 上创建 [somedate] 聚集索引可以提高性能,因为数据将物理排序到您仅查看表尾部的位置。

INSERT INTO archive_table
SELECT [ROWID], [COL1], [COL2]
FROM live_table
WHERE <criteria>

DELETE FROM live_table
WHERE [ROWID] IN
(
   SELECT [ROWID] FROM archive_table WHERE [somedate] >= DATEADD(dy,-30,GETDATE())
)
Run Code Online (Sandbox Code Playgroud)