我有一个非常大的数据库(约100Gb),主要由两个表组成,我想要减小它们的大小(这两个表各有大约5000万条记录)。我在同一台服务器上设置了一个存档数据库,并使用相同的架构来存储这两个表。我正在尝试确定最佳的概念方法来从活动数据库中删除行并将它们插入存档数据库。以下是我现在正在进行的伪代码:
Declare @NextIDs Table(UniqueID)
Declare @twoYearsAgo = two years from today's date
Insert into @NextIDs
SELECT top 100 from myLargeTable Where myLargeTable.actionDate < twoYearsAgo
Insert into myArchiveTable
<fields>
SELECT <fields>
FROM myLargeTable INNER JOIN @NextIDs on myLargeTable.UniqueID = @NextIDs.UniqueID
DELETE MyLargeTable
FROM MyLargeTable INNER JOIN @NextIDs on myLargeTable.UniqueID = @NextIDs.UniqueID
目前,处理1000条记录需要7分钟,速度非常慢。我已经测试了删除和插入操作,两者都需要大约3.5分钟完成,因此它们的效率差异不是很大。有人能提供一些优化建议吗?
谢谢!
这是SQL Server 2000。
编辑:在大表中,ActionDate字段上有一个聚集索引。还有两个其他的索引,但在任何查询中都没有被引用。Archive表中没有索引。在我的测试服务器上,这是唯一访问SQL Server的查询,因此它应该有足够的处理能力。
代码(这会每次以1000条记录为一批进行循环):
DECLARE @NextIDs TABLE(UniqueID int primary key)
DECLARE @TwoYearsAgo datetime
SELECT @TwoYearsAgo = DATEADD(d, (-2 * 365), GetDate())
WHILE EXISTS(SELECT TOP 1 UserName FROM [ISAdminDB].[dbo].[UserUnitAudit] WHERE [ActionDateTime] < @TwoYearsAgo)
BEGIN
BEGIN TRAN
--get all records to be archived
INSERT INTO @NextIDs(UniqueID)
SELECT TOP 1000 UniqueID FROM [ISAdminDB].[dbo].[UserUnitAudit] WHERE [UserUnitAudit].[ActionDateTime] < @TwoYearsAgo
--insert into archive table
INSERT INTO [ISArchive].[dbo].[userunitaudit]
(<Fields>)
SELECT <Fields>
FROM [ISAdminDB].[dbo].[UserUnitAudit] AS a
INNER JOIN @NextIDs AS b ON a.UniqueID = b.UniqueID
--remove from Admin DB
DELETE [ISAdminDB].[dbo].[UserUnitAudit]
FROM [ISAdminDB].[dbo].[UserUnitAudit] AS a
INNER JOIN @NextIDs AS b ON a.UniqueID = b.UniqueID
DELETE FROM @NextIDs
COMMIT
END