更快地从Guid获取SQL兼容字符串的方法

时间:2010-02-16 21:38:09

标签: c# sql-server sql-server-2005 bulkinsert

当我分析我的应用程序时(通过处理一些原始数据创建了大量数据库插入),我注意到了这一特定的代码行:

myStringBuilder.AppendLine(
    string.Join(
        BULK_SEPARATOR, new string[]{myGuid.ToString() ...

请记住,结果字符串最终会在通过TSQL命令BULK INSERT调用的文件中结束,有没有办法可以更快地完成此步骤?我知道获取字节数组更快,但我不能将其插入文件中。

3 个答案:

答案 0 :(得分:2)

最快的最简单的方法是不要将BULK INSERT与原始文件一起使用。相反,请使用SqlBulkCopy类。这应该通过直接通过管道发送数据而不是使用中间文件来显着提高速度。

(您也可以直接使用Guid而不进行任何字符串转换,但我无法100%确定SqlBulkCopy内部使用它。)

答案 1 :(得分:0)

你没有说明你从哪里获得指导。另外,我不相信获取字节会更快,因为你要做Guid类上的ToString方法已经做的事情,迭代字节并转换为字符串值。

相反,我认为这个代码在性能方面可以改进的几个一般领域是(假设你在循环中这样做):

  • 您是否在循环的新迭代中重用myStringBuilder实例?您应该将Length( not Capacity)属性设置为0,然后使用它重建字符串。这将防止必须预热新的StringBuilder实例,并且已经为更大的字符串进行了内存分配。

  • 使用对myStringBuilder的Append调用而不是调用String.Join。 String.Join将预分配一堆内存,然后返回一个字符串实例,您将再次分配(如果在第一次迭代时)或复制到已分配的空间。没有理由这样做两次。相反,遍历你正在创建的数组(或扩展循环,似乎你有一个固定大小的数组)并调用Append,传入guid,然后传入BULK_SEPARATOR。从结尾删除单个字符比较容易,顺便说一下,如果实际附加了Guid,只需将StringBuilder的Length属性减1即可。

答案 2 :(得分:0)

如果时间很关键 - 您是否可以预先创建一个足够长的GUID转换为字符串的列表,然后在您的代码中使用它?在C#中,还是在SQL Server中,具体取决于您的要求?