选择进入SQL Server的问题

时间:2009-08-27 09:48:22

标签: sql sql-server sql-server-2008

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

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

以下是我正在使用的声明,

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

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

提前谢谢, 乔治

3 个答案:

答案 0 :(得分:3)

添加一些分区,以便您没有这样做,一次性完成所有操作。 一次获取一个月的数据,或者以特定数字结尾的所有ID:

这样每个批次都会变得更小。

答案 1 :(得分: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

复制范围

如果您有一个字段,您可以使用它来选择“范围”,例如OrderDate,可以通过运行

之类的查询来开始
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'

答案 2 :(得分:1)

您可能希望使用BCP批量复制数据。