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 存档脚本的主要内容,如果未能解决你的问题,请参考以下文章