gar*_*rik 4 sql-server sql-server-2008-r2
有一个大表(5-6 百万条记录)。我必须将 90% 的旧记录移动到其他数据库(表)。解决方案?
对 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)
对于 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,您可以通过备份和还原来移动数据。
在其他情况下,采取一些批量复制选项。
编辑:
虽然现在是学习分区表的时候了,但这似乎只是企业版的一个选项。
归档时间: |
|
查看次数: |
9040 次 |
最近记录: |