1

我有一个包含大约 500 万条记录的表,我只需要将最后 100 万条移动到生产环境中(因为其他 400 万条在那里)。这样做的最佳方法是什么,这样我就不必每次都重新复制整个表?

4

4 回答 4

2

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

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

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

于 2012-11-14T21:02:52.457 回答
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 的这个迟到的宝石:无需比较,因为我知道 IDs > X,那么您不必进行昂贵的比较。你可以使用

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

这将更有效率,因为您只传输您需要的行。

于 2012-11-14T22:00:31.780 回答
2

因为它们位于改变一切的单独服务器上。简而言之:为了知道什么不在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 并再次导入。这更可靠,因为它是一次性完成的,而不是一直需要网络连接。

于 2012-11-14T22:51:09.730 回答
0

如果表在同一台服务器上,您可以执行以下操作

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

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

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

于 2012-11-14T21:06:14.283 回答