【发布时间】:2015-03-25 16:50:09
【问题描述】:
我在 SQL Server 2012 Express 上使用以下查询将 4 天以前的数据从一个 [主] 数据库移到另一个 [辅助数据库] 以进行归档。唯一的问题是这会使数据库脱机,因为它通常要移动大约 50 万行数据,而且随着更多数据点被添加到数据库中,这个数字正在攀升。结果是我的基于 Web 的应用程序无法访问数据库(在大多数情况下)大约 2 小时,这会导致许多其他进程以及应用程序停止。
DECLARE @4daysago datetime
SELECT @4daysago = DATEADD(d, -4, GetDate());
SET IDENTITY_INSERT [activetrackarchivedb].dbo.[Data Import] ON;
--Transfer from current (production) DB to Archive DB
WITH CTE as (
SELECT TOP 1000000 *
FROM [activetrackdb].dbo.[Data Import]
WHERE [activetrackdb].dbo.[Data Import].[Receive Date] < @7daysago
ORDER BY [Receive Date] ASC)
DELETE CTE
OUTPUT DELETED.id,
DELETED.[Company id],
DELETED.[Site id],
DELETED.[Site name],
DELETED.[Receive date],
DELETED.[Detect date],
INTO [activetrackarchivedb].dbo.[Data Import]
(id,
[Company id],
[Site id],
[Site name],
[Receive date],
[Detect date]);
有没有更好的方法可以用来“转移”这些行?即使新方法速度较慢,如果它至少仍然可以允许访问数据库。这个花了我一周的时间来实现(我是新手),并参与了 StackOverflow 社区的帮助。到现在为止都很好,但是随着数据量的增加,它变得非常繁琐。
这也不是用于备份目的。将行转移到的数据库只是具有更高的容量,并且归档数据仍在生产环境中使用(它只是使主数据库在与其他维护和索引脚本结合时更具可维护性和响应性)
任何帮助将不胜感激。
【问题讨论】:
-
如果您没有接收日期的索引,您还可以测试创建它是否会使其更快。特别是如果您以较小的批次多次执行此操作,那么索引应该会有所帮助。
-
尽管 Stack Overflow 有许多成员拥有扎实的 SQL Server 编程技能,但这可能更像是一个 DBA 问题,我会将问题发布到Database Administrators,因为该社区更针对管理问题(或者我相信)。
-
您为什么使用 CTE?你想以某种方式批处理这个吗?
-
感谢 bot 的回复。我已经在那个coloumn上有一个索引,它确实有帮助,但它仍然很慢......我将在Database Administrators Excahnge上重新发布 - 好点。将保持两者,直到我解决这个问题:)
-
没有特殊原因 RE CTE,有什么更好的?
标签: sql sql-server database archive maintenance