我正在编写一个基于日期时间列归档 SQL Server 表中的行的过程。我想移动日期在 X 之前的所有行,但问题是每个日期有数百万行,所以对每个日期执行 BEGIN TRANSACTION...INSERT...DELETE...COMMIT 需要太长时间,并为其他用户锁定数据库。
有没有办法可以小块做?也许使用 ROWCOUNT 或类似的东西?
我最初考虑过这样的事情:
SET ROWCOUNT 1000
DECLARE @RowsLeft DATETIME
DECLARE @ArchiveDate DATETIME
SET @ROWSLEFT = (SELECT TOP 1 dtcol FROM Events WHERE dtcol <= @ArchiveDate)
WHILE @ROWSLEFT IS NOT NULL
BEGIN
INSERT INTO EventsBackups
SELECT top 1000 * FROM Events
DELETE Events
SET @ROWSLEFT = (SELECT TOP 1 dtcol FROM Events WHERE dtcol <= @ArchiveDate)
END
但后来我意识到我不能保证我正在删除的行是我刚刚备份的行。或者我可以……?
更新: 我考虑过的另一个选项是添加一个步骤:
- 将符合我的日期条件的前 1000 行选择到临时表中
- 开始交易
- 从临时表插入存档表
- 从源表中删除,跨每列加入临时表
- 提交事务
- 重复 1-5 直到没有满足日期条件的行
有没有人知道这个系列的费用与下面讨论的其他一些选项相比如何?
细节:我正在使用 SQL 2005,因为有人问过。