我有一个非常大的数据库(~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 字段上有一个聚集索引。还有另外两个索引,但在任何查询中都没有引用。存档表没有索引。在我的测试服务器上,这是访问 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