You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何无需拆分文件将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比导入导出向导更灵活,可精细控制资源占用:

关键配置步骤:

  1. 创建新的SSIS包,添加平面文件源指向你的大文件,配置正确的分隔符、编码和表头规则。
  2. 添加SQL Server目标组件,连接到目标表。
  3. 双击SQL Server目标,进入高级编辑器,在输入输出属性中设置:
    • 将FastLoadOptions设为TABLOCK,启用快速加载模式。
    • 设置RowsPerBatch为100000左右,控制每批提交的行数。
  4. 导入前通过执行SQL任务禁用目标表的非聚集索引和外键约束,导入完成后再执行SQL重建索引、启用约束。
  5. 调整包的最大并发执行数,避免占用过多数据库资源。

4. 通用性能优化建议

无论使用哪种方案,以下优化都能避免数据库冻结并提升速度:

  • 将数据库恢复模式临时改为简单模式或大容量日志模式,避免批量导入时事务日志暴涨,减少IO压力(导入完成后改回原模式)。
  • 关闭目标表的触发器(导入完成后重新启用),避免每条记录触发额外逻辑。
  • 确保服务器有足够的内存和IO带宽,导入期间尽量避免其他大负载操作。
  • 若表中有自增主键,可提前设置IDENTITY_INSERT ON(如果文件包含自增值),避免SQL Server自动生成值带来的开销。

内容的提问来源于stack exchange,提问作者Teja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 07:45:24