2009-10-22 81 views
8

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

这是我目前的程序(ISAdminDB是主要的DB,ISArchive是归档DB):

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 
+0

哪个RDBMS? SQL Server,MySQL,别的东西? – MartW 2009-10-22 14:38:08

+0

道歉,MS SQL Server 2000. – Kevin 2009-10-22 14:39:20

+0

我猜SQL Server – MartW 2009-10-22 14:39:21

回答

6

首先,你早删除记录不是特定的日期,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 
+0

谢谢!我感谢你的意见。似乎工作。 – Kevin 2009-10-22 17:26:05