我有一个包含大约500万条记录的表,我只需要将最后100万条记录转移到生产环境中(因为其他400万条记录已经存在)。这样做的最好方法是什么,这样我就不必每次都重新复制整个表?
发布于 2012-11-15 06:00:32
更快的可能是:
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的迟来的gem :不需要进行比较,因为我知道ID>X,那么您就不需要进行昂贵的比较。你可以直接使用
Insert into prod.dbo.table (column1, column2....)
Select column1, column2.... from dev.dbo.table d
where ID > x这将大大提高效率,因为您只需要传输所需的行。
发布于 2012-11-15 05:02:52
编辑:(很抱歉修改了这么多。我现在更好地理解了你的问题)
Insert into TblProd
Select * from TblDev where
pkey not in (select pkey from tblprod)这应该只复制目标表中不存在的记录。
发布于 2012-11-15 06:51:10
因为它们位于不同的服务器上,这会改变一切。简而言之:为了知道dev中没有什么,你需要将DEV中的所有东西都与PROD中的所有东西进行比较,所以没有简单的方法可以避免比较巨大的数据集。
用于在PROD和DEV系统之间进行复制的一些不同策略:
A.备份和恢复整个数据库,然后应用脚本进行清理
B.在PROD数据库中实现记录更改的触发器,然后仅复制发生更改的记录
C.识别一些你知道的没有改变的分区或记录集(例如12个月前),只刷新那些不在该数据集中的分区或记录集。
D.使用SSIS将所有prod复制到DEV服务器上的临时表中。使用与上面非常相似的查询,仅在整个数据库中插入新记录。删除临时表。
E.您也许能够找到一个第三方SSIS组件,它可以有效地完成这项工作。开箱即用,SSIS在比较更新方面效率低下。
你真的知道最后一百万条记录是什么吗?也就是说,表示的是地点、日期还是什么?你能写一个select来识别它们吗?
基于这条评论:
不需要比较,因为我知道ID>X会起作用
假设您已经在DEV服务器上创建了一个名为PRODSERVER的链接服务器,则可以在DEV服务器上运行此命令
INSERT INTO DB.dbo.YOURTABLE (COL1, COL2, COL3...)
SELECT COL1, COL2, COL3...
FROM PRODSERVER.DB.dbo.YOURTABLE
WHERE ID > X有关如何创建SQL Server链接服务器的详细信息,请查阅“SQL Server链接服务器”。
这对于一个人来说是很好的,但是如果你经常这样做,你可能想要做一些更健壮的东西。
例如,您可以创建一个脚本,使用BCP.EXE将数据导出到一个文件,将其复制到DEV,然后再次导入。这更可靠,因为它在一批中完成,而不是需要整个时间的网络连接。
https://stackoverflow.com/questions/13387017
复制相似问题