我有一个包含大约 500 万条记录的表,我只需要将最后 100 万条移动到生产环境中(因为其他 400 万条在那里)。这样做的最佳方法是什么,这样我就不必每次都重新复制整个表?
4 回答
编辑:(很抱歉修改了这么多。我现在更好地理解了你的问题)
Insert into TblProd
Select * from TblDev where
pkey not in (select pkey from tblprod)
这应该只复制尚未在目标表中的记录。
快一点可能是:
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 的这个迟到的宝石:无需比较,因为我知道 IDs > X,那么您不必进行昂贵的比较。你可以使用
Insert into prod.dbo.table (column1, column2....)
Select column1, column2.... from dev.dbo.table d
where ID > x
这将更有效率,因为您只传输您需要的行。
因为它们位于改变一切的单独服务器上。简而言之:为了知道什么不在dev 中,您需要将 DEV 中的所有内容与 PROD 中的所有内容进行比较,因此没有简单的方法可以避免比较庞大的数据集。
用于 PROD 和 DEV 系统之间复制的一些不同策略:
A. 备份和恢复整个数据库,然后应用脚本来清理它
B. 在 PROD 数据库中实现记录更改的触发器,然后只复制更改的记录
C. 确定某种分区或您知道不会更改的记录集(即 12 个月前),并且只刷新那些不在该数据集中的记录。
D. 使用 SSIS 将所有产品复制到 DEV 服务器上的临时表中。使用与上面非常相似的查询仅在数据库中插入新记录。删除临时表。
E. 您也许可以找到一个可以有效执行此操作的第三方 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 并再次导入。这更可靠,因为它是一次性完成的,而不是一直需要网络连接。
如果表在同一台服务器上,您可以执行以下操作
我使用的是 MySQL,所以语法可能会有点不同,但在我看来,一切都应该是一样的。
INSERT INTO newTable (columnsYouWantToCopy)
SELECT columnsYouWantToCopy
FROM oldTable WHERE clauseWhichGivesYouOnlyRecodsYouNeed
如果在另一台服务器上,您可以执行以下操作:http: //dev.mysql.com/doc/refman/5.0/en/select-into.html