Более быстрый способ получить SQL-совместимую строку из Guid - PullRequest
3 голосов
/ 17 февраля 2010

Я заметил эту конкретную строку кода, когда я профилировал свое приложение (которое создает множество вставок базы данных путем обработки некоторых необработанных данных):

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

Учитывая, что результирующая строка окажется в файле, вызываемом командой TSQL BULK INSERT, есть ли способ сделать этот шаг быстрее? Я знаю, что получение байтового массива быстрее, но я не могу просто вставить это в файл.

Ответы [ 3 ]

2 голосов
/ 17 февраля 2010

Самым быстрым и самым простым способом было бы вообще не использовать BULK INSERT с необработанным файлом. Вместо этого используйте класс SqlBulkCopy . Это должно значительно ускорить это, посылая данные непосредственно по каналу вместо использования промежуточного файла.

(Вы также сможете использовать Guid напрямую без каких-либо преобразований строк, хотя я не могу быть на 100% уверен, что SqlBulkCopy внутренне с ним делает.)

0 голосов
/ 17 февраля 2010

Если время критично, не могли бы вы заранее создать достаточно длинный список GUID, преобразованных в строку, и затем использовать его в своем коде? Либо в C #, либо, возможно, в SQL Server, в зависимости от ваших требований?

0 голосов
/ 17 февраля 2010

Вы не указываете, откуда вы получаете руководство.Кроме того, я не верю, что получение байтов будет происходить быстрее, так как вы собираетесь делать то, что уже делает метод ToString класса Guid, перебирать байты и преобразовывать в строковое значение.

Скорее, я думаю, что есть несколько общих областей, в которых этот код может быть улучшен с точки зрения производительности (и предполагается, что вы делаете это в цикле):

  • Вы повторно используетеэкземпляр myStringBuilder после новой итерации вашего цикла?Вам следует установить для свойства Length ( not the Capacity) значение 0, а затем перестроить строку, используя это.Это избавит от необходимости прогревать новый экземпляр StringBuilder, и выделение памяти для большей строки уже будет выполнено.

  • Используйте вызовы Append для myStringBuilder вместо вызова String.Join,String.Join собирается предварительно выделить кучу памяти, а затем вернуть экземпляр строки, который вы просто выделите снова (если на первой итерации) или скопируете в уже выделенное пространство.Нет причин делать это дважды.Вместо этого переберите массив, который вы создаете (или разверните цикл, кажется, у вас есть массив фиксированного размера) и вызовите Append, передавая guid, а затем BULK_SEPARATOR.Проще удалить один символ с конца, кстати, просто уменьшите свойство Length объекта StringBuilder на единицу, если вы действительно добавили Guids.

...