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