我有一个数据库,每天会添加一百万行。每天我都想运行一个查询来提取数百万个最老的行(在数据库中留下大约一千万行),然后将它们移动到一个存档数据库中。
有很好的文档记录方法可以使用sql server(bcp,openrowset等)来实现这一点,但据我所知,所有这些方法都会从数据文件中获取所有行。我只想复制行的子集,我找不到任何快速的方法。
答案 0 :(得分:2)
我建议考虑使用SSIS包。您可以准确控制要复制的行,您可以在您选择的事务大小中执行此操作,并且它将执行快速批量插入。
答案 1 :(得分:2)
最简单的方法是使用完全限定名称的查询
INSERT INTO ArchiveDatabase..TableName
SELECT *
FROM ProductionDatabase..TableName
WHERE EntryDate <= dateadd(mm, -6, current_timestamp)
要复制大量数据,通常最好“基于块”。在纯TSQL中执行此操作的最简单方法是这样的:
DECLARE @rowcount int
SET @rowcount = 1
WHILE @rowcount <> 0
BEGIN
INSERT INTO ArchiveDatabase..TableName
SELECT TOP (100000) *
FROM ProductionDatabase..TableName
WHERE EntryDate <= dateadd(mm, -6, current_timestamp)
SET @rowcount = @@ROWCOUNT
END
基本上使用SELECT TOP()
子句将查询限制为100k行并保持循环,直到不再复制记录为止。 (@@ROWCOUNT
返回受影响记录的数量。)
如果数据库位于不同的SQL Server上,则可以设置“链接服务器”并将服务器引用添加到对象名称。完全限定对象名称的格式为<Server>.<Database>.<Owner>.<Object>