将数百万行从一个sql server数据库复制到另一个sql server数据库的最佳方法是什么?

时间:2010-07-02 20:59:24

标签: sql-server-2008

我有一个数据库,每天会添加一百万行。每天我都想运行一个查询来提取数百万个最老的行(在数据库中留下大约一千万行),然后将它们移动到一个存档数据库中。

有很好的文档记录方法可以使用sql server(bcp,openrowset等)来实现这一点,但据我所知,所有这些方法都会从数据文件中获取所有行。我只想复制行的子集,我找不到任何快速的方法。

2 个答案:

答案 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>