代码之家  ›  专栏  ›  技术社区  ›  Brian

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

  •  3
  • Brian  · 技术社区  · 14 年前

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

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

    记住,结果字符串将以通过tsql命令调用的文件结束。 BULK INSERT ,有什么方法可以更快地完成这一步吗?我知道获取字节数组更快,但我不能将其插入到文件中。

    3 回复  |  直到 14 年前
        1
  •  2
  •   Aaronaught    14 年前

    最快的 最简单的方法是不使用 BULK INSERT 一个原始文件。相反,使用 SqlBulkCopy 班级。这应该通过直接通过管道发送数据而不是使用中间文件来显著加快速度。

    (您还可以使用 Guid 直接没有任何字符串转换,尽管我不能100%确定什么 SqlBulkCopy 内部使用。)

        2
  •  0
  •   casperOne    14 年前

    您没有指明从何处获取guid。另外,我不认为获得字节会更快,因为您将要做的是guid类上的toString方法已经做的事情,遍历字节并转换为字符串值。

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

    • 您是否在循环的新迭代上重用myStringBuilder实例?你应该设定长度( capacity)属性设置为0,然后使用该属性重新生成字符串。这将防止必须预热新的StringBuilder实例,并且将已经为较大的字符串分配内存。

    • 使用调用追加到MyStringBuilder,而不是调用String.Join。join将预先分配一堆内存,然后返回一个字符串实例,您只需再次分配(如果在第一次迭代中)或复制到已经分配的空间中。没有理由这样做两次。相反,迭代您正在创建的数组(或者展开循环,看起来您有一个固定大小的数组),然后调用append,传入guid,然后使用大容量分隔符。从末尾移除单个字符(btw)更容易,只需在实际附加guid时将StringBuilder的长度属性减少一个。

        3
  •  0
  •   marc_s    14 年前

    如果时间是关键的-你能提前创建一个足够长的guid转换成字符串的列表,然后在代码中使用它吗?在C中,或者可能在SQL Server中,这取决于您的需求?