如何无需拆分文件将1400万条记录上传至SQL Server 2019?
无需拆分文件批量上传1400万条记录到SQL Server的最优方案
针对1400万条记录的批量导入,导入导出向导因GUI资源限制和锁策略问题容易导致数据库冻结,以下是几个更可控、高效的替代方案:
1. 使用SQL Server原生BULK INSERT/OPENROWSET(BULK...)
这是最轻量化的原生方案,直接通过T-SQL执行,避免GUI工具的额外开销。
核心语法示例(CSV文件):
BULK INSERT YourDatabase.dbo.YourTargetTable FROM 'C:\Path\To\YourLargeFile.csv' WITH ( FIELDTERMINATOR = ',', -- 字段分隔符,根据你的文件格式调整 ROWTERMINATOR = '\n', -- 行分隔符 BATCHSIZE = 100000, -- 每批导入10万条,避免一次性占用过多资源 TABLOCK, -- 获取表级锁,减少锁竞争,提升导入速度 CODEPAGE = '65001', -- 若文件是UTF-8编码,需指定 FIRSTROW = 2 -- 若文件有表头,跳过第一行 );
关键优化点:
- 若文件包含带引号的字段(如
"abc,def"),需配合格式化文件(FORMATFILE)定义字段规则,避免分隔符冲突。 - 导入前禁用目标表的非聚集索引和外键约束,导入完成后重建索引、启用约束——这能大幅降低导入时的IO和锁开销。
2. 使用BCP命令行工具
BCP是专门为海量数据传输设计的命令行工具,性能远高于GUI向导,适合自动化场景。
核心命令示例:
bcp YourDatabase.dbo.YourTargetTable in "C:\Path\To\YourLargeFile.csv" ^ -S YourServerName ^ -U YourUsername ^ -P YourPassword ^ -c ^ # 使用字符格式导入,无需提前定义格式文件 -t, ^ # 字段分隔符 -r\n ^ # 行分隔符 -b 100000 ^ # 每批10万条 -T ^ # 若使用Windows身份验证,替换-U/-P为-T
优势:
- 命令行执行,资源占用极低,不会因GUI进程导致数据库资源争抢。
- 支持通过
-b参数精准控制批量大小,平衡导入速度和数据库负载。
3. 使用SSIS(SQL Server Integration Services)
如果需要可视化配置复杂的导入逻辑,SSIS比导入导出向导更灵活,可精细控制资源占用:
关键配置步骤:
- 创建新的SSIS包,添加平面文件源指向你的大文件,配置正确的分隔符、编码和表头规则。
- 添加SQL Server目标组件,连接到目标表。
- 双击SQL Server目标,进入高级编辑器,在输入输出属性中设置:
- 将
FastLoadOptions设为TABLOCK,启用快速加载模式。 - 设置
RowsPerBatch为100000左右,控制每批提交的行数。
- 将
- 导入前通过执行SQL任务禁用目标表的非聚集索引和外键约束,导入完成后再执行SQL重建索引、启用约束。
- 调整包的最大并发执行数,避免占用过多数据库资源。
4. 通用性能优化建议
无论使用哪种方案,以下优化都能避免数据库冻结并提升速度:
- 将数据库恢复模式临时改为简单模式或大容量日志模式,避免批量导入时事务日志暴涨,减少IO压力(导入完成后改回原模式)。
- 关闭目标表的触发器(导入完成后重新启用),避免每条记录触发额外逻辑。
- 确保服务器有足够的内存和IO带宽,导入期间尽量避免其他大负载操作。
- 若表中有自增主键,可提前设置
IDENTITY_INSERT ON(如果文件包含自增值),避免SQL Server自动生成值带来的开销。
内容的提问来源于stack exchange,提问作者Teja
相关产品推荐
相关产品推荐

