如何从大表中移动数据

gar*_*rik 4 sql-server sql-server-2008-r2

有一个表(5-6 百万条记录)。我必须将 90% 的记录移动到其他数据库(表)。解决方案?

Mar*_*ith 7

对 Rolando 的建议进行了一些补充。

如果您要清除旧表并填充新表,则可以使用 OUTPUT 子句。请注意日志增长的可能性,如果这可能是一个问题,请考虑使用循环/批处理方法。

DELETE
    OldDatabase.dbo.MyTable
OUTPUT
    DELETED.col1
    , DELETED.col2
    , DELETED.col3
INTO
    NewDatabase.dbo.MyTable
Run Code Online (Sandbox Code Playgroud)

BCP 是一个需要注意的方便的替代方案。请注意,这是使用 SQLCMD 语法。

:setvar SourceServer OldServer
:setvar SourceDatabase OldDatabase
:setvar DestinationServer NewServer
:setvar DestinationDatabase NewDatabase
:setvar BCPFilePath "C:\"

!!bcp "$(SourceDatabase).dbo.MyTable" FORMAT nul -S "$(SourceServer)" -T -n -q -f "$(BCPFilePath)MyTable.fmt"
!!bcp "SELECT * FROM $(SourceDatabase).dbo.MyTable WHERE col1=x AND col2=y" queryout "$(BCPFilePath)MyTable.dat" -S "$(SourceServer)" -T -q -f "$(BCPFilePath)MyTable.fmt" -> "$(BCPFilePath)MyTable.txt"
!!bcp "$(DestinationDatabase).dbo.MyTable" in $(BCPFilePath)MyTable.dat -S $(DestinationServer) -T -E -q -b 2500 -h "TABLOCK" -f $(BCPFilePath)MyTable.fmt
Run Code Online (Sandbox Code Playgroud)


ber*_*d_k 5

对于 SQL Server,真正的问题是避免记录已删除的行。

我的建议是
在简单恢复模式下设置第二个数据库。复制整个表

Select * into SEM..Copy from Original

Truncate Original

Insert into Original Select * from SEM..Copy
Run Code Online (Sandbox Code Playgroud)

如果目标服务器是相同版本的 SQL Server,您可以通过备份和还原来移动数据。

在其他情况下,采取一些批量复制选项。

编辑:

虽然现在是学习分区表的时候了,但这似乎只是企业版的一个选项。