SQL 存档脚本

Posted

技术标签:

【中文标题】SQL 存档脚本【英文标题】:SQL Archive Script 【发布时间】:2009-10-22 14:31:23 【问题描述】:

我正在尝试将数据库中的表中的记录存档到存档数据库中的相同表中。我需要能够对日期大于三年前的所有记录进行插入,然后删除这些行。但是,这个表有数百万条实时记录,所以我想一次运行大约 100 到 1000 个块的循环。到目前为止,我的存储过程完成了整个插入语句,然后是一个删除语句(在事务中),其 WHERE 子句与插入语句基本相同。我的 WHILE 循环正在查找表中最旧的日期以确定循环何时完成。其中一些似乎效率很低。有没有一种方法可以对记录块进行插入和删除,而不必在同一个循环执行中查找它们两次?有没有更好的方法来确定 WHILE 语句何时完成?运行 MS SQL Server 2000。

这是我当前的过程(ISAdminDB 是主数据库,ISArchive 是存档数据库):

    WHILE ( (SELECT MIN( [MyTable].[DateTime]) FROM  [ISAdminDB].[dbo].[MyTable]) < DATEADD(d, -(3 * 365), GetDate()))
BEGIN

INSERT INTO [ISArchive].[dbo].[MyTable] 
(<Fields>)
SELECT TOP 1000 (<Fields>)
FROM  [ISAdminDB].[dbo].[MyTable]
WHERE 
   [MyTable].[DateTime] < DATEADD(d, -(3 * 365), GetDate())
AND  UniqueID in (SELECT TOP 1000 UniqueID  FROM  [ISAdminDB].[dbo].[MyTable] ORDER BY [MyTable].[DateTime] ASC )

BEGIN TRAN
DELETE FROM  [ISAdminDB].[dbo].[MyTable]
WHERE   [MyTable].[DateTime] < DATEADD(d, -(3 * 365), GetDate()) 
AND  (UniqueID in (SELECT TOP 1000 UniqueID FROM  [ISAdminDB].[dbo].[MyTable] ORDER BY [MyTable].[DateTime] ASC))
COMMIT

END

【问题讨论】:

哪个 RDBMS? SQL Server、mysql 还是其他? 抱歉,MS SQL Server 2000。 【参考方案1】:

首先,您要删除早于 3 年前的特定日期的记录。您不在乎它们被删除的顺序,您只需要继续删除它们直到没有任何剩余。您还可以通过使用临时表来存储 ID 并将截止日期存储在变量中并重复引用来加快速度。

所以现在我们有了:

DECLARE @NextIDs TABLE(UniqueID int primary key)
DECLARE @ThreeYearsAgo datetime
SELECT @ThreeYearsAgo = DATEADD(d, -(3 * 365), GetDate())

WHILE EXISTS(SELECT 1 FROM [ISAdminDB].[dbo].[MyTable] WHERE [MyTable].[DateTime] < @ThreeYearsAgo)
BEGIN 
    BEGIN TRAN 

    INSERT INTO @NextIDs(UniqueID)
        SELECT TOP 1000 UniqueID FROM [ISAdminDB].[dbo].[MyTable] WHERE [MyTable].[DateTime] < @ThreeYearsAgo

    INSERT INTO [ISArchive].[dbo].[MyTable] (<Fields>) 
        SELECT (<Fields>) 
        FROM  [ISAdminDB].[dbo].[MyTable] AS a
        INNER JOIN @NextIDs AS b ON a.UniqueID = b.UniqueID

    DELETE [ISAdminDB].[dbo].[MyTable]
    FROM  [ISAdminDB].[dbo].[MyTable] 
    INNER JOIN @NextIDs AS b ON a.UniqueID = b.UniqueID 

    DELETE FROM @NextIDs

    COMMIT TRAN
END 

【讨论】:

以上是关于SQL 存档脚本的主要内容,如果未能解决你的问题,请参考以下文章

在 Perl 脚本中无法将目录添加到存档

SQL Server 2019 - 每天存档远程数据库,每个表中都有存档日期

仅为 Xcode 4 中的“存档”构建运行脚本

使用 powershell 和 7zip 创建存档的脚本

vbscript 存档文件的VBS脚本

每周在新工作表中复制和存档表单响应的 Google 脚本