这是我的第一个问题“将“SQL”导出到 T-SQL ”的后续内容。
我正在使用我无法控制且无法更改的第 3 方程序。该程序会将其内部数据库导出为一组,.sql
每个数据库的格式为:
INSERT INTO [ExampleDB] ( [IntField] , [VarcharField], [BinaryField])
VALUES
(1 , 'Some Text' , 0x123456),
(2 , 'B' , NULL),
--(SNIP, it does this for 1000 records)
(999, 'E' , null);
(1000 , 'F' , null);
INSERT INTO [ExampleDB] ( [IntField] , [VarcharField] , BinaryField)
VALUES
(1001 , 'asdg', null),
(1002 , 'asdf' , 0xdeadbeef),
(1003 , 'dfghdfhg' , null),
(1004 , 'sfdhsdhdshd' , null),
--(SNIP 1000 more lines)
这种模式一直持续到.sql
文件达到导出期间设置的文件大小,导出文件按EXPORT_PATH\%Table_Name%\Export#.sql
其中 # 是从 1 开始的计数器分组。
目前我有大约 1.3GB 的数据,我有它以 1MB 的块导出(26 个表中的 1407 个文件,除了 5 个表之外的所有表只有一个文件,最大的表有 207 个文件)。
现在我只有一个简单的 C# 程序,它将每个文件读入 ram 然后调用ExecuteNonQuery。问题是我平均 60 秒/文件,这意味着它需要大约 23 小时才能完成整个导出。
我假设如果我如何格式化要使用 BULK INSERT 而不是 INSERT INTO 加载的文件,它可能会更快。有没有简单的方法可以做到这一点,或者我必须编写某种查找和替换并保持我的手指交叉,它不会在某些极端情况下失败并炸毁我的数据。
任何其他关于如何加快插入速度的建议也将不胜感激。
更新:
我最终进行了解析并执行了 SqlBulkCopy 方法。它从 1 个文件/分钟开始。1 文件/秒。