这是我的第一个问题“Porting “SQL” export to T-SQL”的后续。将一个完整的“INSERT INTO xxx VALUES”文件转换为大容量插入文件可解析的文件
我正在与第三方程序,我无法控制,我不能改变。这一计划将它导出的内部数据库中,以一组每.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它可以更快。是否有任何简单的方法来做到这一点,或者我必须写一些种类的查找&替换并保持我的手指交叉,它不会在某些角落案件失败并炸毁我的数据。
关于如何加快插入的任何其他建议也将不胜感激。
UPDATE:
我结束了与parse and do a SqlBulkCopy method去。它从1个文件/分钟。到1个文件/秒。
确保交易正在使用 - 我假设每个文件只有一个“INSERT INTO”,但是......也就是说,确保问题是由于首先不使用TDS引起的。由于大多数工具(包括批量数据/合并)都了解CSV,因此将数据转化为CSV可能最容易。同时确保选择的群集不会愚蠢,并在插入时抖动IO。 – 2012-04-03 22:26:15
@pst在每个文件中有多个插入,每1000行有一个'INSERT INTO',就好像你尝试插入的不止一个那样你会得到一个错误'INSERT语句中的行值表达式的数量超过最大允许的1000个行值的数量.'。我提取的问题是*是否有任何简单的方法来转换为CSV或我必须写一些种类的查找和替换,并保持我的手指交叉,它不会在某些角落的情况下失败,炸毁我的数据。 – 2012-04-03 22:31:22
@pst你能否详细说明交易如何帮助加速交易?我应该为每个文件做一个事务还是有一个打开的事务,然后在解析所有文件时提交它?另外我将如何检查IO Thrashing? – 2012-04-03 22:34:37