2009-08-27 38 views
2

我正在使用SQL Server 2008,我需要从一个数据库的一个表中选择所有数据到同一SQL Server实例上另一个数据库的另一个表中。选择到SQL Server的问题

这是我的脚本使用。服务器将耗尽内存。数据很大 - 磁盘上的表大小约为50G。任何简单的替代解决方案或任何解决方案来降低内存消耗都很好该服务器具有16G物理RAM并且是x64。

这里是我使用的语句,

insert into [TargetDB].[dbo].[Orders] 
select * 
from [SourceDB].[dbo].[Orders]; 

任何快速和简单的解决方案?

由于事先 乔治

回答

2

复制分批

INSERT INTO [TargetDB].[dbo].[Orders] 
SELECT TOP 100 * 
FROM [SourceDB].[dbo].[Orders] S 
WHERE NOT EXISTS 
(
SELECT 1 FROM [TargetDB].[dbo].[Orders] T1 
WHERE T1.OrderId = S.orderID 
) 

应该这样做在100批次,其中你可以调整,以适合的,你需要处理的记录数。此代码假设你有某种形式的独特价值,如的OrderId的在数据键关机复制过程范围

如果你有,你可以用它来选择字段,“范围”

复制如订购日期,运行如下

SELECT OrderDate, COUNT(1) 
FROM [SourceDB].[dbo].[Orders] 

查询,看看有多少不同的值有多少条记录有每个不同的值开始。这应该让你选择一些范围 - 然后使用远程查询整个数据复制(如2009-01-01> 2009-01-31。):

INSERT INTO [TargetDB].[dbo].[Orders] 
SELECT * 
FROM [SourceDB].[dbo].[Orders] 
WHERE OrderDate BETWEEN '2009-01-01 00:00:00.000' AND '2009-01-31 23:59:59.997' 
+0

感谢罗布,如果我需要将所有数据复制到目标数据库表,如何编写一个循环让它在一些批次中完成所有的事情? – George2 2009-08-27 09:59:35

+1

@ George2 - 如果这是一个一次性的过程,可能更容易手动执行大块数据库,让数据库有机会在批次间“呼吸”,特别是因为您以前遇到内存不足问题=) – Rob 2009-08-27 10:03:44

+0

Hi Rob,in my表中,没有可以用作范围指示符的列。我只有一个用作聚簇索引的GUID类型ID。我的解决方案的任何想法?我不需要任何合并的概念,目标表是空的,我只需要将所有源数据复制到目标表中。再次感谢! – George2 2009-08-27 10:08:59

3

添加一些分区,这样你不不要一下子把所有东西都拿走。 一次获取一个月的数据,或者以特定数字结尾的所有ID:s。

这样每个批次都变小一点。

+0

感谢idstam,目前只有ID是群集主键,它是类型GUID。我有一个想法来编写一个循环,并在每次迭代中复制批处理(例如,对于每次迭代,例如10,000条记录)? – George2 2009-08-27 10:01:19

1

您可能想要考虑使用BCP来批量复制数据。