将大量表记录从SQL Server Dev复制到Prod

时间:2012-11-14 20:45:28

标签: sql sql-server sql-server-2005

我有一张约500万条记录的表格,我只需要将最后100万条记录转移到生产区域(其他400万条记录都在那里)。这样做的最佳方法是什么,所以我不必每次都重新复制整个表格?

4 个答案:

答案 0 :(得分:2)

编辑:(很抱歉修改这么多。我现在更好地理解你的问题了)

Insert into TblProd
     Select * from TblDev where 
     pkey not in (select pkey from tblprod)

这应该只复制目标表中尚未存在的记录。

答案 1 :(得分:2)

可能会快一点:

Insert into prod.dbo.table (column1, column2....)
Select column1, column2.... from dev.dbo.table d
where not exists (
    select 1 from prod.dbo.table pc where pc.pkey = d.pkey
    )

但是你需要告诉我们这些表是否在同一台服务器上

此次运行的频率以及需要的强大程度如何?根据您的要求,有其他解决方案。

鉴于来自OP的这个迟到的宝石:无需比较,因为我知道ID> X ,那么你不必进行昂贵的比较。你可以使用

Insert into prod.dbo.table (column1, column2....)
Select column1, column2.... from dev.dbo.table d
where ID > x

由于您只传输所需的行,因此效率会高得多。

答案 2 :(得分:2)

因为它们位于更改所有内容的单独服务器上。简而言之:为了了解开发中的不是,您需要将DEV中的所有内容与PROD中的所有内容进行比较,因此没有简单的方法可以避免比较大型数据集。

用于PROD和DEV系统之间复制的一些不同策略:

一个。备份并恢复整个数据库,然后应用脚本进行清理

B中。在PROD数据库中实现记录更改的触发器,然后仅复制

中已更改的记录

℃。确定您知道不会更改的某种分区或记录集(即12个月前),并仅刷新那些不在该数据集中的记录。

d。使用SSIS将所有prod复制到DEV服务器上的临时表中。使用与上面非常相似的查询仅在数据库中插入新记录。删除登台表。

电子。您可能能够找到有效执行此操作的第三方SSIS组件。开箱即用,SSIS在比较更新方面效率低下。

你真的知道那些最后的百万条记录是什么吗?即是一个位置或日期或什么?你能写一个选择来识别它们吗?

基于此评论:

无需比较,因为我知道ID> X将起作用

您可以在DEV服务器上运行此操作,假设您已在DEV服务器上创建了名为PRODSERVER的链接服务器

INSERT INTO DB.dbo.YOURTABLE (COL1, COL2, COL3...)
SELECT COL1, COL2, COL3...
FROM PRODSERVER.DB.dbo.YOURTABLE
WHERE ID > X

查找“SQL Server链接服务器”以获取有关如何创建一个的更多信息。

这对一次性很好,但如果你经常这样做,你可能想要做一些更强大的东西。

例如,您可以创建一个脚本,使用BCP.EXE将数据导出到文件,将其复制到DEV并再次导入。这样做更可靠,因为它在一个批次中完成,而不是一直需要网络连接。

答案 3 :(得分:0)

如果表位于同一台服务器上,您可以执行类似这样的操作

我使用的是MySQL,因此语法可能会略有不同,但在我看来,一切都应该是一样的。

INSERT INTO newTable (columnsYouWantToCopy)
    SELECT columnsYouWantToCopy
    FROM oldTable WHERE clauseWhichGivesYouOnlyRecodsYouNeed

如果在另一台服务器上,您可以执行以下操作: http://dev.mysql.com/doc/refman/5.0/en/select-into.html