如何将巨大的表数据复制到SQL Server中的另一个表中

sql*_*ild 30 sql sql-server sql-server-2005 copying

我有一个340万行的表.我想将这整个数据复制到另一个表中.

我正在使用以下查询执行此任务:

select * 
into new_items 
from productDB.dbo.items
Run Code Online (Sandbox Code Playgroud)

我需要知道完成这项任务的最佳方法.

Mat*_*tin 72

我有同样的问题,除了我有一个20亿行的表,所以如果我这样做,日志文件将会增长到最后,即使恢复模型设置为Bulk-Logging:

insert into newtable select * from oldtable
Run Code Online (Sandbox Code Playgroud)

所以我操作数据块.这样,如果传输中断,您只需重新启动它.此外,您不需要与表一样大的日志文件.你似乎也得到更少的tempdb I/O,不知道为什么.

set identity_insert newtable on
DECLARE @StartID bigint, @LastID bigint, @EndID bigint
select @StartID = isNull(max(id),0) + 1
from newtable

select @LastID = max(ID)
from oldtable

while @StartID < @LastID
begin
    set @EndID = @StartID + 1000000

    insert into newtable (FIELDS,GO,HERE)
    select FIELDS,GO,HERE from oldtable (NOLOCK)
    where id BETWEEN @StartID AND @EndId

    set @StartID = @EndID + 1
end
set identity_insert newtable off
go
Run Code Online (Sandbox Code Playgroud)

您可能需要更改ID的处理方式,如果您的表按ID进行聚类,则效果最佳.


Ste*_*ung 15

如果要复制到表中,最快的方法可能就是您的问题,除非您的行非常大.

如果您的行非常大,您可能希望在SQL Server中使用批量插入函数.我想你可以用C#打电话给他们.

或者您可以先将该数据下载到文本文件中,然后批量复制(bcp)它.这具有允许您忽略键,索引等的额外好处.

还可以尝试SQL Management Studio附带的导入/导出实用程序; 不确定它是否会像直接批量复制一样快,但它应该允许你跳过作为平面文件写出的中间步骤,并且只是直接从表到表复制,这可能比你的SELECT INTO陈述.

  • 我知道这有点晚了,但只是想在我的情况下分享(有70万行非常大的行),导入/导出实用程序往往会显示"延迟准备无法完成".查询超时已过期(Microsoft SQL Server Native Client 10.0)`错误. (4认同)

ear*_*xtr 11

我一直在使用DBA将具有240M行的审计表复制到另一个数据库.

使用简单的select/insert创建了一个巨大的tempdb文件.

使用导入/导出向导,但在10分钟内复制了8M行

创建自定义SSIS包并调整设置在10Min中复制30M行

SSIS软件包对我们来说是最快和最有效的

伯爵

  • 你还记得“调整设置”吗? (3认同)

use*_*998 5

这是传输大表的另一种方法.我刚刚在两台服务器之间传输了1.05亿行.很快.

  1. 右键单击数据库,然后选择" 任务/导出数据".
  2. 向导将指导您完成这些步骤,但您选择SQL Server客户端作为数据源,目标将允许您选择要传输的数据库和表.

有关详细信息,请参阅https://www.mssqltips.com/sqlservertutorial/202/simple-way-to-export-data-from-sql-server/

  • 此技术代表您构建并运行 SSIS 包。您可以选择保存但不执行它创建的包。这使您可以在运行之前打开它并调整每个批次的行数等内容,以优化表特征和系统资源,同时省去最初从头开始编写包的麻烦。 (2认同)