如何将含INSERT语句的18GB超大SQL文件导入SQL Server数据库?
大体积SQL脚本导入优化方案
针对18GB的SQL脚本导入问题,以下是几个高效可行的方案:
一、直接用sqlcmd命令行完整导入(无需分割)
sqlcmd是SQL Server原生命令行工具,比SSMS更稳定,支持大文件导入,无需手动分割脚本:
- Windows认证命令示例:
sqlcmd -S 你的服务器名 -E -d 目标数据库 -i "D:\你的18GB脚本.sql" -b -o "D:\导入日志.txt" -h -1 -W - SQL Server认证命令示例:
sqlcmd -S 你的服务器名 -U 用户名 -P 密码 -d 目标数据库 -i "D:\你的18GB脚本.sql" -b -o "D:\导入日志.txt" -h -1 -W
参数说明:
-b:执行出错时立即终止,方便定位问题-o:生成执行日志,记录报错细节-h -1:取消结果集表头输出,提升执行效率-W:取消列宽自动调整,减少不必要的格式处理
二、导入前的关键优化(大幅提升速度)
切换数据库恢复模式为简单模式
减少事务日志生成量,避免日志文件暴涨:ALTER DATABASE 目标数据库 SET RECOVERY SIMPLE;导入完成后,可按需切换回完整模式:
ALTER DATABASE 目标数据库 SET RECOVERY FULL;禁用所有约束和索引
按需求禁用外键、检查约束,同时禁用非聚集索引,避免插入数据时的额外开销:-- 禁用所有表的约束 EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT ALL"; -- 禁用所有表的非聚集索引 EXEC sp_msforeachtable "ALTER INDEX ALL ON ? DISABLE";导入完成后,可根据需要重新启用:
-- 启用所有约束 EXEC sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT ALL"; -- 重建所有索引 EXEC sp_msforeachtable "ALTER INDEX ALL ON ? REBUILD";调整事务提交方式
在脚本开头添加以下语句,减少频繁提交事务的开销:SET IMPLICIT_TRANSACTIONS ON; SET NOCOUNT ON;脚本结尾添加:
COMMIT;
三、PowerShell分批执行(应对内存限制)
如果sqlcmd执行中出现内存不足问题,可通过PowerShell按GO语句自动分割批次执行,无需手动修改脚本:
$scriptPath = "D:\你的18GB脚本.sql" $serverName = "你的服务器名" $dbName = "目标数据库" $batch = "" Get-Content $scriptPath -ReadCount 1000 | ForEach-Object { foreach ($line in $_) { if ($line.Trim() -eq "GO") { Invoke-SqlCmd -ServerInstance $serverName -Database $dbName -Query $batch $batch = "" } else { $batch += $line + "`n" } } } # 执行最后一批未完成的语句 if ($batch -ne "") { Invoke-SqlCmd -ServerInstance $serverName -Database $dbName -Query $batch }
内容的提问来源于stack exchange,提问作者SoulM
相关产品推荐
相关产品推荐

