SQL档案脚本
发布时间:2020-05-24 13:54:10 所属栏目:MsSql 来源:互联网
导读:我正在尝试将记录从数据库中的表归档到归档数据库中的相同表.我需要能够为日期大于三年的所有记录执行插入操作,然后删除这些行.但是,这个表有数百万个实时记录,所以我希望一次以大约100到1000个块的循环运行它.到目前为止,我的存储过程执行整个insert语句,然
|
我正在尝试将记录从数据库中的表归档到归档数据库中的相同表.我需要能够为日期大于三年的所有记录执行插入操作,然后删除这些行.但是,这个表有数百万个实时记录,所以我希望一次以大约100到1000个块的循环运行它.到目前为止,我的存储过程执行整个insert语句,然后执行一个delete语句(在事务中),其中包含与insert语句基本相同的WHERE子句.我的WHILE循环正在查找表中最早的日期,以确定循环何时完成.其中一些似乎效率很低.有没有一种方法可以在记录块上进行插入和删除,而不必在同一个循环执行中查找它们两次?有没有更好的方法来确定WHILE语句何时完成?运行MS SQL Server 2000. 这是我目前的程序(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,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,GetDate()) AND (UniqueID in (SELECT TOP 1000 UniqueID FROM [ISAdminDB].[dbo].[MyTable] ORDER BY [MyTable].[DateTime] ASC)) COMMIT END 解决方法首先,您要删除3年前特定日期之前的记录.你不关心它们被删除的顺序,你只需要保持删除它们直到没有任何剩余.您还可以通过使用临时表来存储ID,以及将截止日期存储在变量中并反复引用它来加快速度.所以现在我们有: DECLARE @NextIDs TABLE(UniqueID int primary key)
DECLARE @ThreeYearsAgo datetime
SELECT @ThreeYearsAgo = DATEADD(d,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 (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
