2009-10-22 61 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